一、前言
结构体操作同c,接口隐式实现,面向对象。
二、学习代码
Go
package main
import "fmt"
// 接口
// 下面可以写方法来实现其中的函数
// 如果一个结构体这几个函数都实现了,那么就可以用这个接口的类型来接收这个结构体的实例
type cal interface {
areaSize() float64
perimeter() float64
}
//下面两个结构体定义
type area struct {
long int
width int
}
type circle struct {
radius float64
}
func (x *area) getLong() int { //结构体指针的方法,调用,可改变实际的值
return x.long
}
//下面四个实现接口中的函数
func (x area) areaSize() float64 { //方法,可以结构体直接加点调用
return float64(x.long * x.width)
}
func (x area) perimeter() float64 {
return float64(2 * (x.long + x.width))
}
func (c circle) areaSize() float64 {
return 3.14 * c.radius * c.radius
}
func (c circle) perimeter() float64 {
return 2 * 3.14 * c.radius
}
func menu(c cal) { //传参要求是cal接口类型,a和c都实现了cal接口,所以可以传入
fmt.Println("面积:", c.areaSize())
fmt.Println("周长:", c.perimeter())
}
func main() {
a := area{long: 10, width: 5} //结构体操作同c
fmt.Println(a.areaSize())
a.width = 10 //结构体赋值
fmt.Println(a.areaSize())
pa := &a //结构体指针
fmt.Println(pa.getLong()) //用指针的方法
c := circle{radius: 5}
fmt.Println(c.areaSize())
//只要一个类型拥有接口声明的所有方法,它就自动实现了该接口。
//下面相当于实现了接口的两个方法,areaSize()和perimeter(),所以可以传入menu函数
menu(a) //传入结构体
menu(c) //传入结构体
}
三、运行结果
bash
50
100
10
78.5
面积: 100
周长: 40
面积: 78.5
周长: 31.400000000000002