Go组合模式通过统一Component接口实现树形结构管理,Leaf(如File)和Composite(如Directory)均实现该接口,支持无差别调用GetName、Print、Size等方法,新增节点类型只需实现接口,无需修改现有逻辑。

用 Go 实现组合模式管理树形结构,核心在于让节点(Leaf)和子树(Composite)实现同一接口,从而对它们进行统一操作——无需区分是单个元素还是容器,调用方式完全一致。
所有节点类型都实现 Component 接口,包含基本行为:获取名称、打印结构、计算大小(或其他业务逻辑)等。这是组合模式的基石。
例如:
type Component interface {
GetName() string
Print(indent string)
Size() int
}
这样,无论后续是文件(Leaf)还是目录(Composite),外部代码都只依赖这个接口,不关心具体类型。
立即学习“g
o语言免费学习笔记(深入)”;
叶子节点不包含子节点,它的行为是自包含的。比如一个文件:
Boomy
AI音乐生成工具,创建生成音乐,与世界分享.
368
查看详情
type File struct {
name string
size int
}
<p>func (f <em>File) GetName() string { return f.name }
func (f </em>File) Print(indent string) {
fmt.Printf("%s- %s (file, %d bytes)\n", indent, f.name, f.size)
}
func (f *File) Size() int { return f.size }
它直接返回自身信息,不递归,也不处理子项。
容器节点持有多个 Component,它把请求转发给子节点,并可能聚合结果:
type Directory struct {
name string
children []Component
}
<p>func (d <em>Directory) GetName() string { return d.name }
func (d </em>Directory) Print(indent string) {
fmt.Printf("%s+ %s (dir)\n", indent, d.name)
for <em>, c := range d.children {
c.Print(indent + " ")
}
}
func (d *Directory) Size() int {
total := 0
for </em>, c := range d.children {
total += c.Size()
}
return total
}
关键点:
组合模式的优势在构造和调用时最明显——客户端代码完全无感节点类型差异:
root := &Directory{name: "root"}
src := &Directory{name: "src"}
mainFile := &File{name: "main.go", size: 1240}
goMod := &File{name: "go.mod", size: 86}
<p>src.children = append(src.children, mainFile, goMod)
root.children = append(root.children, src, &File{name: "README.md", size: 520})</p><p>root.Print("") // 统一调用,自动展开整棵树
fmt.Println("Total size:", root.Size()) // 自动累加所有叶子大小
你会发现,添加新层级、替换某节点、遍历或统计,都不需要 if/switch 判断类型——Go 的接口多态和组合模式天然契合。
以上就是如何使用Golang实现组合模式管理树形结构_统一处理节点与子节点的详细内容,更多请关注其它相关文章!
# 多态
# 花店网站推广方案设计
# 济南seo教育培训
# 0基础seo教程视频
# 新疆建设工程协会网站
# seo每月咨询
# 找不到营销推广平台
# 印江seo优化公司
# 绍兴怎样建设网站
# 全国seo招商信息
# 网站的建设银行签约
# 这是
# 不同类型
# go
# 或其他
# 布尔
# 子树
# 只需
# 与子
# 如何使用
# 递归
# switch
# ai
# app
# golang
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
百度网盘网页入口链接分享 百度网盘官网入口网页登录
diskgenius分区工具如何设置Bios启动项
word文档中的分隔符有哪些不同类型和用途_Word分隔符类型与用途方法
Mac怎么关闭按键声音_Mac键盘打字音效设置
12306售票时间最新规定 | 网上订票和车站窗口时间一样吗
抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍
多闪APP官方下载安装入口_多闪最新版本获取入口
《爱南宁》认证电动车方法
抖音火山版如何进行提现
《大润发优鲜》充值方法介绍
win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】
Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧
C++ static关键字作用_C++静态成员变量与静态函数
从HTML表单获取逗号分隔值并转换为NumPy数组进行预测
一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化
51漫画网实时入口 51漫画网页版官方免费漫画入口
J*aScript实现网页表单实时输入字段比较与验证教程
Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南
4399小游戏下装链接 4399小游戏下载链接入口
青橙手机语音助手怎么唤醒_青橙手机语音助手设置与唤醒方法
《原神》月之一版本新增书籍一览
易车网官网直达入口 易车网在线登录入口
向往的生活小游戏启动处_向往的生活小游戏立即启动
123网页端官方登录页 123邮箱网页版即时通讯服务
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
《糖豆》添加舞曲方法
Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南
店铺如何关联视频号推广?视频号推广有什么用?
mysql如何回滚事务_mysql ROLLBACK事务回滚方法
CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化
Python实时数据流中高效查找最大最小值
菜鸟驿站的取件码忘了怎么办 手机快速查询指南
PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略
泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口
j*a中ArrayBlockingQueue的使用
快手网页版官方访问 快手网页版页面在线打开
《暗黑破坏神4》国服回归送狂欢礼包 价值6916元
解决Go encoding/json 将JSON大数字解析为浮点数的问题
PDF如何批量加注释_PDF多文件批注高亮操作教程
我居然低估了 DeepSeek,这次更新它做到了这些!
《百度畅听版》关闭兴趣推荐方法
跨语言测试实践:使用Python Selenium测试现有J*a Web项目
一点万象签到领积分指南
QQ网页版入口导航 QQ网页版在线访问通道
猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程
win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】
顺丰快递怎么查物流_顺丰快递物流信息实时查询操作指南
多闪电脑版下载_多闪PC端模拟器使用
b站怎么用微信登录_b站微信登录方法
曝《丝之歌》DLC有望开发!开发商还有神秘新企划
2025-12-20
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。