Go语言学习——结构体的匿名字段、嵌套结构体、结构体的“继承”

结构体的匿名字段

匿名字段默认会采用类型名作为字段名

结构体体里的字段是唯一的 不能冲突的

一个结构体中同种类型的匿名字段只能有一个

匿名字段:没有名字的字段

package main

import "fmt"

// 匿名字段
// 字段比较少也比较简单的场景
// 不常用!!!

type person struct {
// name string
// age int
string
int
}

func main() {
p1 := person{
"紫霞",
18,
}
fmt.Println(p1)
fmt.Println(p1.string)
fmt.Println(p1.int)
}

嵌套结构体

嵌套匿名字段

嵌套结构体的字段名冲突

匿名嵌套结构体

匿名嵌套结构体的字段冲突

package main

import "fmt"

// 嵌套结构体

type address struct {
province string
city string
}

type workPlace struct {
province string
city string
}

type person struct {
name string
age int
// province string
// city string
// addr address
address // 匿名嵌套结构体
// address:aaddress
workPlace
}

type company struct {
name string
// province string
// city string
addr address
}

func main() {
p1 := person{
name: "李霞",
age: 12,
// addr: address{
address: address{
province: "陕西省",
city: "西安市",
},
}
fmt.Println(p1)
// fmt.Println(p1.name, p1.addr.city)
fmt.Println(p1.name, p1.address.city)
// fmt.Println(p1.city) // 先在自己结构体找这个字段,找不到就去匿名嵌套的结构体中查找该字段
fmt.Println(p1.address.city)
fmt.Println(p1.workPlace.city)
}

结构体的“继承”

package main

import "fmt"

// 结构体模拟实现其他语言中的"继承"

type animal struct {
name string
}

// 给animal实现一个移动的方法
func (a animal) move() {
fmt.Printf("%s会动!\n", a.name)
}

// 狗类
type dog struct {
feet uint8
animal // animal 拥有的方法dog此时也有
}

// 给dog实现一个汪汪汪的方法
func (d dog) wang() {
fmt.Println("汪汪汪~")
fmt.Printf("%s在叫:汪汪汪\n", d.animal.name)
fmt.Printf("%s在叫:汪汪汪\n", d.name)
}

func main() {
d1 := dog{
feet: 4,
animal: animal{name: "小白"},
}
fmt.Println(d1)
d1.wang()
d1.move()
}

posted @ 2022-06-02 23:37  寻月隐君  阅读(256)  评论(0)    收藏  举报