目录

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}
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
唐人街都是苦瓜脸21 分钟前
Java RPC 框架是什么
java·开发语言·rpc
追逐时光者23 分钟前
一款 .NET 开源、免费、轻量级且非侵入性的防火墙软件
后端·.net
黑不溜秋的27 分钟前
Ubuntu24.04 编译 Qt 源码
开发语言·qt
ALex_zry28 分钟前
C++17模板编程与if constexpr深度解析
开发语言·c++·性能优化
AugustShuai1 小时前
API-标准controller接口
开发语言·json·设计规范·post·标准接口
幻想趾于现实1 小时前
C# Winform 入门(15)之制作二维码和拼接(QR)
开发语言·c#·winform
wniuniu_1 小时前
Pow工作量证明是啥
开发语言·区块链·php
多云的夏天1 小时前
C++-FFmpeg-(5)-1-ffmpeg原理-ffmpeg编码接口-AVFrame-AVPacket-最简单demo
java·开发语言
leluckys1 小时前
swift-11-init、deinit、可选链、协议、元类型
开发语言·ios·swift
njsgcs1 小时前
vscode swift hello world
开发语言·ios·swift