先来看一段代码:
package main
import "fmt"
type Say interface {
Hello()
}
type Human struct {
name string
age int
}
type Student struct {
Human //匿名字段
class string
}
//Student实现接口
func (man Human) Hello() {
fmt.Printf("my name is:%s\n", man.name)
fmt.Printf("my age is:%d\n", man.age)
}
func main() {
stu := Student{Human{"outman", 18},"2班"}
fmt.Printf("name:%s\n", stu.name)
fmt.Printf("class:%s\n", stu.class)
stu.Hello()
}
运行结果:
name:outman
class:2班
my name is:outman
my age is:18
有没有发现Student可以访问Human字段的成员和方法,像不像面向对象中的继承?对。没错,go语言用如此优雅的方式实现了
现在对代码稍加修改,在Student中加一个字段age,这样出现了两个age,在访问的时候该如何抉择呢?
package main
import "fmt"
type Say interface {
Hello()
}
type Human struct {
name string
age int
}
type Student struct {
Human //匿名字段
age int
class string
}
//Student实现接口
func (man Human) Hello() {
fmt.Printf("my name is:%s\n", man.name)
fmt.Printf("my age is:%d\n", man.age)
}
func main() {
stu := Student{Human{"outman", 18}, 19, "2班"}
fmt.Printf("name:%s\n", stu.name)
fmt.Printf("class:%s\n", stu.class)
stu.Hello()
fmt.Printf("student age:%d\n", stu.age)
fmt.Printf("human age:%d\n", stu.Human.age)
}
Go里面很简单的解决了这个问题,最外层的优先访问,也就是当你通过student.age访问的时候,是访问Student里面的字段,而不是Human里面的字段,这样就允许我们去重载通过匿名字段继承的一些字段,当然如果我们想访问重载后对应匿名类型里面的字段,可以通过匿名字段名来访问
总结:
1.结构体的匿名字段,可以实现继承的思想;
2.当结构中有和匿名字段相同的字段时,采用外层优先访问原则;
3.不仅仅是struct字段,所有的内置类型和自定义类型都是可以作为匿名字段;
有疑问加站长微信联系(非本文作者)