go匿名字段

匿名字段

Golang匿名字段 :可以像字段成员那样访问匿名字段方法,编译器负责查找。

复制代码
package main

import "fmt"

type User struct {
    id   int
    name string
}

type Manager struct {
    User
}

func (self *User) ToString() string { // receiver = &(Manager.User)
    return fmt.Sprintf("User: %p, %v", self, self)
}

func main() {
    m := Manager{User{1, "Tom"}}
    fmt.Printf("Manager: %p\n", &m)
    fmt.Println(m.ToString())
}

输出结果:

复制代码
    Manager: 0xc42000a060
    User: 0xc42000a060, &{1 Tom}

通过匿名字段,可获得和继承类似的复用能力。依据编译器查找次序,只需在外层定义同名方法,就可以实现 "override"。

复制代码
package main

import "fmt"

type User struct {
    id   int
    name string
}

type Manager struct {
    User
    title string
}

func (self *User) ToString() string {
    return fmt.Sprintf("User: %p, %v", self, self)
}

func (self *Manager) ToString() string {
    return fmt.Sprintf("Manager: %p, %v", self, self)
}

func main() {
    m := Manager{User{1, "Tom"}, "Administrator"}

    fmt.Println(m.ToString())

    fmt.Println(m.User.ToString())
}

输出结果:

复制代码
    Manager: 0xc420074180, &{{1 Tom} Administrator}
    User: 0xc420074180, &{1 Tom}
相关推荐
你的人类朋友10 小时前
说说签名与验签
后端
databook10 小时前
Manim实现脉冲闪烁特效
后端·python·动效
canonical_entropy14 小时前
AI时代,我们还需要低代码吗?—— 一场关于模型、演化与软件未来的深度问答
后端·低代码·aigc
颜如玉14 小时前
HikariCP:Dead code elimination优化
后端·性能优化·源码
考虑考虑15 小时前
Jpa使用union all
java·spring boot·后端
bobz96516 小时前
virtio vs vfio
后端
Rexi16 小时前
“Controller→Service→DAO”三层架构
后端
bobz96517 小时前
计算虚拟化的设计
后端
深圳蔓延科技17 小时前
Kafka的高性能之路
后端·kafka
Barcke17 小时前
深入浅出 Spring WebFlux:从核心原理到深度实战
后端