首页 > 后端开发 > Golang > 正文

Go 结构体的值继承:嵌入与组合

聖光之護
发布: 2025-09-17 20:09:01
原创
1067人浏览过

go 结构体的值继承:嵌入与组合

在 Go 语言中,虽然没有像面向对象编程语言那样的传统继承概念,但我们可以通过嵌入(Embedding)组合(Composition)这两种方式来实现类似的效果,从而在一个结构体中访问另一个结构体的字段。本文将详细介绍这两种方法,并探讨它们之间的区别

结构体嵌入(Embedding)

结构体嵌入是指将一个结构体类型直接嵌入到另一个结构体中,被嵌入的结构体的字段会提升到外层结构体,可以直接通过外层结构体的实例访问。

type Foo struct {
    Val1, Val2, Val3 int
}

type Bar struct {
    Foo
    OtherVal string
}

func main() {
    f := &Foo{123, 234, 354}
    b := &Bar{*f, "test"} // 初始化 Bar 时需要解引用 Foo 实例
    println(b.Val2)       // 输出 234

    f.Val2 = 567          // 修改 Foo 实例的值
    println(b.Val2)       // 仍然输出 234,因为 b 中的 Foo 是一个拷贝
}
登录后复制

在上面的例子中,Foo 结构体被嵌入到 Bar 结构体中。因此,我们可以直接通过 Bar 类型的实例 b 访问 Foo 的字段 Val2。

注意事项:

  • 嵌入时,Bar 中包含的是 Foo 的一个拷贝。这意味着,即使修改了原始 Foo 实例的值,Bar 实例中的 Foo 字段的值也不会改变。
  • 初始化 Bar 结构体时,需要解引用 Foo 结构体指针,创建一个新的 Foo 结构体实例。

结构体组合(Composition)

结构体组合是指在一个结构体中包含另一个结构体的指针。通过这种方式,外层结构体可以访问被组合结构体的字段,并且对被组合结构体字段的修改会反映到外层结构体。

BibiGPT-哔哔终结者
BibiGPT-哔哔终结者

B站视频总结器-一键总结 音视频内容

BibiGPT-哔哔终结者 28
查看详情 BibiGPT-哔哔终结者
type Foo struct {
    Val1, Val2, Val3 int
}

type Bar struct {
    *Foo
    OtherVal string
}

func main() {
    f := &Foo{123, 234, 354}
    b := &Bar{f, "test"}   // Bar 包含指向 Foo 的指针
    println(b.Val2)       // 输出 234

    f.Val2 = 567          // 修改 Foo 实例的值
    println(b.Val2)       // 输出 567,因为 b 持有指向 Foo 的指针
}
登录后复制

在上面的例子中,Bar 结构体包含一个指向 Foo 结构体的指针。这意味着,Bar 结构体实际上引用了 Foo 结构体。因此,当修改原始 Foo 实例的值时,Bar 实例中的 Foo 字段的值也会随之改变。

注意事项:

  • 组合时,Bar 中包含的是指向 Foo 的指针。这意味着,对原始 Foo 实例的修改会直接影响到 Bar 实例。
  • 初始化 Bar 结构体时,直接传递 Foo 结构体指针即可。

嵌入 vs. 组合

特性 嵌入 (Embedding) 组合 (Composition)
包含关系 包含被嵌入结构体的拷贝 包含指向被组合结构体的指针
值的修改 修改原始结构体的值不会影响嵌入结构体 修改原始结构体的值会影响组合结构体
初始化方式 需要解引用原始结构体实例进行拷贝 直接传递原始结构体指针
适用场景 需要独立于原始结构体维护状态时 需要共享原始结构体的状态并保持同步时

总结

在 Go 语言中,虽然没有传统意义上的继承,但通过嵌入和组合这两种方式,可以实现类似的功能。选择哪种方式取决于具体的需求:如果需要独立维护被嵌入结构体的状态,则选择嵌入;如果需要共享被组合结构体的状态并保持同步,则选择组合。理解这两种方法的区别,可以帮助我们编写更灵活、更高效的 Go 代码。

以上就是Go 结构体的值继承:嵌入与组合的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号