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())
}