接口
go语言中没有类的概念,但可以利用接口模拟实现类的继承及多态
只要某结构体实现了某接口的所有方法,那么就可以说该结构体实现了该接口,接口的引用即可代表所有实现结构体
func main() { //创建三角形实例 var t1 Triangle = Triangle{3, 4, 5} fmt.Println(t1.peri()) fmt.Println(t1.area()) fmt.Println(t1.a, t1.b, t1.c) //创建圆形实例 var c1 Circle = Circle{4} fmt.Println(c1.peri()) fmt.Println(c1.area()) fmt.Println(c1.radius) //三角形t1实现接口 var s1 Shape s1 = t1 fmt.Println(s1.peri()) fmt.Println(s1.area()) //圆形c1实现接口 var s2 Shape s2 = c1 fmt.Println(s2.peri()) fmt.Println(s2.area()) testShape(t1) testShape(c1) testShape(s1) //实例 var t2 *Triangle = &Triangle{3, 4, 2} fmt.Printf("t2:%T,%p\n",t2,&t2) getType2(t2) } func getType2(s Shape) { //断言实现 switch ins := s.(type) { case Triangle: fmt.Println("三角形 ", ins.a, ins.b, ins.c) case Circle: fmt.Println("圆形 ", ins.radius) case *Triangle: fmt.Println("三角形结构体指针:",ins.a,ins.b,ins.c) } } //测试方法,参数可以传入接口Shape及其“子类”,体现多态 func testShape(s Shape) { fmt.Printf("周长:%.2f,面积:%.2f\n", s.peri(), s.area()) } //创建接口 type Shape interface { peri() float64 area() float64 } //创建三角形结构体 type Triangle struct { a, b, c float64 } //三角形结构体实现接口周长方法 func (t Triangle) peri() float64 { return t.a + t.b + t.c } //三角形结构体实现接口面积方法 func (t Triangle) area() float64 { p := t.peri() / 2 s := math.Sqrt(p * (p - t.a) * (p - t.b) * (p - t.c)) return s } //创建圆形结构体 type Circle struct { radius float64 } //圆形结构体实现接口周长方法 func (c Circle) peri() float64 { return c.radius * 2 * math.Pi } //圆形结构体实现接口面积方法 func (c Circle) area() float64 { return math.Pow(c.radius, 2) * math.Pi }