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}
相关推荐
无限大61 天前
为什么电脑需要"内存"和"硬盘"?——存储金字塔的秘密
后端
程序员zgh1 天前
Linux系统常用命令集合
linux·运维·服务器·c语言·开发语言·c++
獭.獭.1 天前
C++ -- STL【unordered_set与unordered_map的实现】
开发语言·c++·unordered_map·unordered_set
山海青风1 天前
语音合成 - 用 Python 合成藏语三大方言语音
开发语言·python·音视频
ovensi1 天前
Docker+NestJS+ELK:从零搭建全链路日志监控系统
后端·nestjs
占疏1 天前
dify API访问工作流/聊天
开发语言·数据库·python
武子康1 天前
大数据-184 Elasticsearch Doc Values 机制详解:列式存储如何支撑排序/聚合/脚本
大数据·后端·elasticsearch
四月__1 天前
http八股
后端
沐森1 天前
rust并发
后端
似水এ᭄往昔1 天前
【C++】--AVL树的认识和实现
开发语言·数据结构·c++·算法·stl