go 匿名字段

阅读: 评论:0

go 匿名字段

go 匿名字段

原文: 

定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go语言支持只提供类型,而不写字段名的方式,也就是匿名字段,或称为嵌入字段。

当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。

type Human struct {

    name string

    age int

    weight int

    phone  string

}

不仅仅是struct字段,所有的内置类型和自定义类型都可以作为匿名字段

type Skills []string

type Student struct {

    Human  // 匿名字段,那么默认Student就包含了Human的所有字段

    Skills //匿名字段

    speciality string

    phone  string

}

type Skills []string

mark.Skills = []string{"anatomy"}

fmt.Println("His name is ", mark.name)

最外层的优先访问,也就是当你通过student.phone访问的时候,是访问student里面的字段,而不是human里面的字段。

fmt.Println("Student phone is ", mark.phone)

fmt.Println("Student phone is ", mark.Human.phone) 


Go语言中的结构体可以定义匿名字段。Go语言中没有对象,但是结构体却有大量对象的功能。并且用匿名字段的确可以实现对象的继承和重载


A1得到了A的所有字段,A称为匿名字段。A1同样也得到A的所有方法,这个可称为继承:

type A struct{}

func (self *A)do() {
    fmt.Println("A.do")  
}

type A1 struct {
    A
}
func main(){
    var a A1
    a.do()  
}

在A1中能定义和A中重名的方法,这个可称为重写: 重写方法和字段一样,遵循最外层的优先访问原则

type A struct{
}

func (self *A)do() {
    fmt.Println("A.do")  
}

type A1 struct {
    A
}

func (self *A1) do() {
    fmt.Println("A1.do")
}

func main(){
    var a A1
    a.do() 
    a.A.do()
}


go不是面向对象的语言,举例:

type parent struct{    

}


type child struct{
    parent
}

func(p *parent)MethodA(){
    fmt.Println("parent MethodA")
    p.MethodB()
}

func(p *parent)MethodB(){
    fmt.Println("parent MethodB")
}

func(c *child)MethodB(){
    fmt.Println("child MethodB")
}

func main() {
    child := new(child)
    child.MethodA()  
}

结果:

parent MethodA
 parent MethodB

解释:

go不是面向对象的语言,go的方法调用是依据"对象"类型的,而不是对象本身,go使用组合的方式实现"继承",方法与结构类型绑定,而不是对象


本文发布于:2024-01-29 10:34:48,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170649569314670.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字段
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23