本文将介绍继承
、组合
这些复用概念在golang中是如何体现的。
在golang中,通过匿名结构体成员,可以访问匿名结构体中定义的的方法,就是所谓的实继承
。
通过具名结构体成员,也可以访问该结构体中定义的方法,这就是所谓的组合
。
1.匿名结构体成员---继承
例子1
结构体A1
中包含匿名结构体A
。
定义A1
的变量a1,通过a1访问A
的方法。
package main
import (
"fmt"
)
type A struct {
}
func (t *A) Print(){
fmt.Println("I am A.")
}
type A1 struct {
A
}
func main() {
a1 := A1{}
a1.Print()
}
output:
I am A.
从输出结果可以看到,A1
结构体的变量a1
可以访问到A
结构体中定义的Print()
方法。也就是A1继承
了A。
例子2
定义接口Aer
,其中包含方法Print()
。
接着定义A
、A1
。
A1中包含匿名结构体A。
定义测试函数test()
,其参数是Aer
接口类型。
package main
import (
"fmt"
)
type Aer interface {
Print()
}
type A struct {
}
func (t *A) Print(){
fmt.Println("I am A.")
}
type A1 struct {
A
}
func test(ai Aer) {
ai.Print()
}
func main() {
a1 := &A1{}
test(a1)
}
output:
I am A.
通过输出可以看到,A1实现了Aer
接口的Print()
方法。
而这实际上是"继承"自A
。
2.具名结构体成员--组合
例子1
结构体A1
中包含结构体A
类型的变量a
。
定义结构体A
的变量a,接着使用a定义结构体A1
类型变量
a1。
最后通过a1访问a,再通过a访问A
的方法。
package main
import (
"fmt"
)
type A struct {
}
func (t *A) Print(){
fmt.Println("I am A.")
}
type A1 struct {
a A
}
func main() {
a := A{}
a1 := A1{a}
a1.a.Print()
}
output:
I am A.
从输出结果可以看到,
例子2
定义接口Aer
,其中包含方法Print()
。
接着定义A
、A1
。
A1中包含结构体A类型变量a作为成员变量。
最后,测试A1是否实现了接口Aer
。
package main
import (
"fmt"
)
type Aer interface {
Print()
}
type A struct {
}
func (t *A) Print(){
fmt.Println("I am A.")
}
type A1 struct {
a A
}
func main() {
a := A{}
a1 := A1{a}
var i interface {} = a1
ai, ok := i.(Aer)
if ok {
fmt.Println("a1 implement Aer")
ai.Print()
} else {
fmt.Println("a1 not implement Aer")
}
}
output:
a1 not implement Aer
通过结果可以看到,结构体A1并没有实现接口Aer
。
也就是说,通过组合
方式,没有"继承"相关的方法。
3.参考
Just try, don't shy.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现