type Person struct {
name string
}
type Human interface {
run()
}
type Student struct {
name string
}
func (p Person) run() {
fmt.Printf("%s is runing\n", p.name)
}
func (s Student) run() {
fmt.Printf("%s is runing\n", s.name)
}
func test() {
p := Person{name: "person"}
s := Student{name: "student"}
var human Human
human = Human(s)
human.run()
p.run()
}
func main() {
test()
}
就像如上,我都有run()方法,实现的同样的功能,这
代码会不会是多余的?
结构体:person 和student可以看作类,然后他们的run方法实现了interface里的run。
interface可以将两个结构体作为一个类型处理。如下例子:
func test() {
p := Person{name: "person"}
s := Student{name: "student"}
var human []Human
human = append(human, p, s)
for _, v := range human {
v.run()
}
}
Go中虽没有class,但依旧有method
通过显示说明receiver来实现与某个类型的结合
只能为同一个包中的类型定义方法
receiver可以是类型的值或者指针
不存在方法重载
可以使用值或指针来调用方法,编译器会自动完成转换
从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数(Method Value vs. Method Expression)
如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
类型别名不会拥有底层类型所附带的方法
方法可以调用结构中的非公开字段
有点多余,你的代码里Student 和 Person 都实现了 Human这个接口。
var human Human
human = Human(s)
human.run()
这段代码可以用这句话直接替代
s.run()