继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Golang 接口学习心得(一)

铁心木吉
关注TA
已关注
手记 2
粉丝 0
获赞 35
package main

import "math"
import "fmt"

/*

一直对接口和结构体以及成员方法之间的联系很难确定,今天终于对接口有了新的认识,笔记如下

定义了一个 Shape 接口,

该接口有两个方法,Area和Perimeter,并且分别写了两个Get方法,用来分别计算面积和周长(这一步其实是没用的)

随后,

分别定义了长方形和圆形的结构体,并且分别实现了 Shape 接口.

在 func main() {} 中,

分别用了 Get 方法和调用 interface 成员方法去计算周长和面积,可以看出,

接口的作用就在于去作为"中间体"去调用结构体的成员方法

没有必要再去对借口内部的方法进行重新定义!!

Shit !!! 拨开乌云见日月了

按照这个思路,可以用自己的思路去重写刘坚君老师布置的 "software_company" 作业了,

再也不用拘束在老师定义的结构体成员方法和接口内了



补充说明:

之后我又定义了一个"正方形"的结构体,但是仅实现计算面积的成员方法,

在 main 方法中通过 Shape 接口去计算正方形的面积会怎么样呢?

结果如下:

cannot convert &square (type Square) to type Shape: Square does not implement Shape (missing perimeter method)

提示 "正方形" 这个结构体没有实现 "perimeter" 这个方法,

添加 "perimeter" 方法后即可计算正方形面积

这就是所谓的 "只要结构体实现了接口的所有方法,它就实现了这个接口!"

虽然就是这么回事,但是理解和不理解之间,写 interface 的感觉是不一样的.现在我可以按照自己的想法去定义接口里面的方法了,

虽然不一定是最合理的,但是一定是有一定意义的.



—— END
*/

//------------接口------------//

type Shape interface {
    area() float64      // 计算面积
    perimeter() float64 // 计算周长
}

func GetArea(shape Shape) float64 {
    return shape.area()
}

func GetPeri(shape Shape) float64 {
    return shape.perimeter()
}

//------------矩形------------//

type Rect struct {
    width, height float64
}

func (r *Rect) area() float64 {
    return r.width * r.height
}

func (r *Rect) perimeter() float64 {
    return (r.height + r.width) * 2
}

//------------圆形------------//

type Circle struct {
    radius float64
}

func (c *Circle) area() float64 {
    return math.Pi * c.radius * c.radius
}

func (c *Circle) perimeter() float64 {
    return 2 * math.Pi * c.radius
}

//------------方形------------//

type Square struct {
    side float64
}

func (s *Square) area() float64 {
    return s.side * s.side
}

func (s *Square) perimeter() float64 {
    return s.side * 4
}

/ =========================================================== /

func main() {
    rect := Rect{
        width:  0.5,
        height: 1.5,
    }
    fmt.Println("矩形的周长是:", GetPeri(&rect))
    fmt.Println("矩形的面积是:", GetArea(&rect))

    circle := Circle{
        radius: 1,
    }
    fmt.Println("圆形的周长是:", Shape(&circle).perimeter())
    fmt.Println("圆形的面积是:", Shape(&circle).area())

    square := Square{
        side: 0.5,
    }
    fmt.Println("正方形的面积是:", Shape(&square).area())
}
打开App,阅读手记
9人推荐
发表评论
随时随地看视频慕课网APP