Loading

Golang 的嵌套结构体提高代码复用性【继承】

一:结构体中嵌套一个结构体

import "fmt"
type Test struct{
    Name string
    age int
    int
}
type Test1 struct{
    Test //匿名函数中的大小写都能访问到对应的属性或者方法
}

func(a *Test)getAttrbute(){

}
func(a *Test)GetAttrbute1(){

}

func main(){
    var a Test1
    fmt.Println(a.Test.getAttrbute(),
                a.Test.Name,
                a.Test.getAttrbute1(),
                a.Test.age) 
    //可以简化为
    fmt.Println(a.getAttrbute(),
                a.Name,
                a.getAttrbute1(),
                a.age) 
}

注意:

1.匿名函数中的大小写都能访问到对应的属性或者方法

2.当结构体和匿名结构体存在相同的字段或者方法时,利用就近原则取值

执行流程:

先看结构体本身是否存在对应的属性或者方法,如果有就用自己的,如果没有就用匿名结构体中对应的属性或者方法

二:当一个结构体嵌套多个匿名结构体

 

import "fmt"
type Java struct{
    Name string
    address string
}
type Python struct{
    Name string
    attr string
}

type PHP struct{
    Java //匿名结构体
    Python//匿名结构体
    Name string
}

type Golang struct{
    j Java  //有名结构体【组合关系】
}

func main(){
    var p PHP
    p.Name = "我是PHP" // 如果 p 没有Name字段,只有 Java 、Python 有Name,这个时候必须通过指定匿名函数结构体名字来区分了
    fmt.Println(a.Name) 
    var g Golang  //如果 g 中是一个有名结构体,则访问有名结构体的字段时,必须带上有名结构体的名字   比如:g.j.Name
    g.j.Name = = "我是Golang" 

}

 

posted @ 2024-10-08 17:44  Carver大脸猫  阅读(20)  评论(0)    收藏  举报