Go实现组合模式的关键是让叶子和容器节点实现统一Node接口,通过接口+嵌入+方法集表达层次关系;File实现基础行为,Folder聚合Node切片并委托操作,Add方法仅限组合节点,调用方无需类型判断即可统一处理树结构。
用 Go 实现组合模式(Composite Pattern)的关键在于:让叶子节点和容器节点实现同一接口,从而能统一处理树形结构中的任意节点,无需区分“有没有子节点”。Go 没有继承,但靠接口 + 嵌入(embedding)+
方法集,能干净地表达“整体-部分”的层次关系。
所有节点——无论是文件(叶子)还是文件夹(容器)——都实现同一个接口,比如 Node:
(接口只声明行为,不关心具体是叶子还是组合)
type Node interface {
GetName() string
GetSize() int64
Print(indent string)
}
这个接口覆盖了树遍历、统计、展示等常见需求。只要类型实现了这三个方法,它就是合法的树节点。
比如一个普通文件,它没有子节点,GetSize() 返回自身大小,Print() 不递归:
type File struct {
name string
size int64
}
func (f *File) GetName() string { return f.name }
func (f *File) GetSize() int64 { return f.size }
func (f *File) Print(indent string) {
fmt.Printf("%s? %s (%d bytes)\n", indent, f.name, f.size)
}
比如文件夹,它持有子节点切片,并把操作委托给子节点:
type Folder struct {
name string
children []Node // 关键:存的是接口,可混装 File 和 Folder
}
func (f *Folder) GetName() string { return f.name }
func (f *Folder) GetSize() int64 {
var total int64
for _, child := range f.children {
total += child.GetSize()
}
return total
}
func (f *Folder) Print(indent string) {
fmt.Printf("%s? %s\n", indent, f.name)
for _, child := range f.children {
child.Print(indent + " ") // 向下缩进,递归打印
}
}
func (f *Folder) Add(child Node) {
f.children = append(f.children, child)
}
注意:Add 是组合节点特有方法,不必塞进 Node 接口——组合模式不要求所有方法对称,只保证公共行为一致。
你可以自由嵌套,代码清晰直观:
root := &Folder{name: "project"}
src := &Folder{name: "src"}
src.Add(&File{name: "main.go", size: 1024})
src.Add(&File{name: "utils.go", size: 512})
root.Add(src)
root.Add(&File{name: "go.mod", size: 128})
fmt.Println("Tree size:", root.GetSize()) // → 1664
root.Print("") // 自动缩进打印整棵树
调用方完全不用判断 if folder != nil 或 if file != nil ——所有节点都当 Node 处理,递归逻辑收在 Print 和 GetSize 内部。
基本上就这些。Go 的组合模式不依赖类继承,靠接口契约 + 值/指针接收者 + 切片存接口,轻量又灵活。关键不是“模仿 Java 写法”,而是抓住“统一操作入口”这个本质。
# java
# node
# go
# golang
# app
# ai
相关文章:
如何用免费手机建站系统零基础打造专业网站?
如何在建站之星网店版论坛获取技术支持?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何撰写建站申请书?关键要点有哪些?
b2c电商网站制作流程,b2c水平综合的电商平台?
如何实现建站之星域名转发设置?
网站制作免费,什么网站能看正片电影?
如何选择高效稳定的ISP建站解决方案?
如何零成本快速生成个人自助网站?
制作证书网站有哪些,全国城建培训中心证书查询官网?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
北京专业网站制作设计师招聘,北京白云观官方网站?
建站之星图片链接生成指南:自助建站与智能设计教程
C++如何编写函数模板?(泛型编程入门)
建站之星备案是否影响网站上线时间?
浅谈Javascript中的Label语句
临沂网站制作公司有哪些,临沂第四中学官网?
建站之星如何实现网站加密操作?
如何续费美橙建站之星域名及服务?
网站app免费制作软件,能免费看各大网站视频的手机app?
南平网站制作公司,2025年南平市事业单位报名时间?
如何选择高性价比服务器搭建个人网站?
如何通过二级域名建站提升品牌影响力?
如何设计高效校园网站?
宝塔面板如何快速创建新站点?
如何安全更换建站之星模板并保留数据?
如何在阿里云通过域名搭建网站?
建站之星价格显示格式升级,你的预算足够吗?
如何用花生壳三步快速搭建专属网站?
linux top下的 minerd 木马清除方法
建站之星logo尺寸如何设置最合适?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
成都网站制作报价公司,成都工业用气开户费用?
如何通过虚拟机搭建网站?详细步骤解析
英语简历制作免费网站推荐,如何将简历翻译成英文?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
定制建站是什么?如何实现个性化需求?
如何快速辨别茅台真假?关键步骤解析
,sp开头的版面叫什么?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
如何用搬瓦工VPS快速搭建个人网站?
如何通过可视化优化提升建站效果?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
想学网站制作怎么学,建立一个网站要花费多少?
*请认真填写需求信息,我们会在24小时内与您取得联系。