17 Golang结构体详解(三)


本文摘自网络,作者,侵删。

一、结构体嵌套
  • demo1
type User struct {
    username string
    password string 
    sex string
    age int 
    address Address //User结构体嵌套Address结构体
}

type Address struct {
    name string
    phone string
    city string
}

func main() {
    var u User
    u.username = "lxc"
    u.password = "123456"
    u.address.name = "张三"
    u.address.phone = "010-1234567"
    u.address.city = "北京"
    fmt.Printf("%#v",u)
    //main.User{username:"lxc", password:"123456", sex:"", age:0, address:main.Address{name:"张三", phone:"010-1234567", city:"北京"}}
}
  • 嵌套匿名结构体
type User stuct {
    username string
    password string 
    Address
}

type Address struct {
    name string
    phone string
    city string
}

func main() {
    var u User
    u.city = "上海"
    fmt.Println(u.city)//上海
    fmt.Println(u.Address.city)//上海
}
  • 关于嵌套结构体的字段名冲突(就近原则)
type User struct {
    username string 
    password string
    addtime string
    Address
}

type Address struct {
    name string
    phone string
    city string
    addtime string
}

type Email struct {
    account string
    addtime string
}

func main () {
    var u User
    u.city = "上海"
    u.addtime = "2021-03-10"
    fmt.Println(u)
    //main.User{username:"", password:"", addtime:"2021-03-10", Address:main.Address{name:"",phone:"", city:"上海", addtime:""}}
    u.Address.addtime = "2021-06-10"
    fmt.Println(u)
}
  • 当两个子结构同级、就近原则不法判断时,程序就会报错
type User struct {
    username string
    password string
    Address
    Email
}

type Address struct {
    name string 
    phone string
    city string
    addtime string
}

type Email struct {
    account string
    addtime string
}

func main() {
    var u User
    //u.addtime = "2021-06-06"//报错 ambiguous selector u.addtime
    u.Address.addtime = "2021-06-06"
    u.Email.addtime = "2021-06-07"
    fmt.Println(u)
    //main.User{username:"", password:"", Address:main.Address{name:"", phone:"", city:"", addtime:"2021-06-06"}, Email:main.Email{account:"", addtime:"2021-06-07"}}
}
二、结构体的继承

Go语言中,结构体的继承是通过嵌套实现的

每次都从子结构体向父结构体中去找

//父结构体
type Animal struct {
    Name string
}

//子结构体
type Dog struct {
    Age int
    Animal //结构体嵌套
}

func (a Animal) run() {
    fmt.Printf("%v在运动 ", a.Name)
}

func (d Dog) wang() {
    fmt.Printf("%v在汪汪 ", d.Name)
}

func main() {
    var d = Dog {
        Age : 20,
        Animal : Animal{
            Name : "旺财",
        },
    }
    d.run()
    d.wang()
    //旺财在运动 旺财在汪汪 
}
  • 通过传递指针
type Animal struct {
    Name string
}

type Dog struct {
    Age int
    *Animal //结构体嵌套
}

func (a Animal) run() {
    fmt.Printf("%v在运动 ", a.Name)
}

func (d Dog) wang() {
    fmt.Printf("%v在汪汪 ", d.Name)
}

func main() {
    var d = Dog {
        Age : 20,
        Animal : &Animal{
            Name : "旺财",
        },
    }
    d.run()
    d.wang()
    //旺财在运动 旺财在汪汪 
}

本文来自:简书

感谢作者:learninginto

查看原文:17 Golang结构体详解(三)

相关阅读 >>

Golang接口哪里好

我为何从php 加入到 Go 的潮流!

Golang gmssl编译不过

Golang 无向简单图邻接多重表

Go build和Go install的区别

Golang造轮子,封装一个简单的http client

快看!Go-carbon 1.2.2 版本发布了!新增了时间设置和时间差比较功能

堆排序

Golang 结构体的思考

Golang指针转字符串,Golang字符串转指针

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...