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 】
相关推荐:
厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项
在PySimpleGUI中实现键盘按键绑定按钮事件
Vue 3中独立响应式实例的创建与应用
Git命令与VS Code UI操作的对应关系解析
Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法
微信如何设置字体大小_微信字体设置的阅读舒适
sublime如何撤销关闭的标签页_sublime重新打开已关闭文件技巧
b站如何剪辑视频_b站必剪app使用教程
纯CSS实现滚动时动态时间轴线条颜色填充效果
优化2xN网格最大路径和的动态规划算法实践
《微信》视频号原创声明开启方法
MySQL多重JOIN技巧:高效关联同一表获取多角色信息
解决SQLAlchemy模型跨文件关联的Linter兼容性指南
《小宇宙》标记不友善评论方法
Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频
《一起考教师》账号注销方法
支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法
多闪APP官方下载安装入口_多闪最新版本获取入口
虫虫助手如何更新游戏
《跳跳舞蹈》循环播放方法
《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐
126邮箱申请入口官网_126邮箱注册免费登录2025
《波斯王子:失落的王冠》剑术大师打法攻略
Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法
如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法
win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】
大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日
包子漫画官网链接官方地址 包子漫画在线观看官网首页入口
漫蛙官网(首页入口)_漫蛙漫画稳定访问教程分享
Linux如何开发轻量级数据服务模块_Linux服务化设计
Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南
Go语言反射机制:如何访问被嵌入结构体遮蔽的方法
利用Flexbox实现图片元素的二维布局:2x2网格排列指南
有道AI翻译入口 智能写作官方网站入口
盲鳗善于分泌黏液猜猜主要用来做什么
byrutor直接访问入口 byrutor官方游戏库
CSS布局中意外顶部空白的调试与解决:深入理解padding-top
Excel宏怎么删除_Excel中删除宏的详细操作流程
京东快递包裹信息查询入口 京东快递官方查询平台入口
《健康大兴》注册方法介绍
composer licenses 命令:如何检查项目依赖的许可证?
《蓝色星原:旅谣》坐骑获取攻略
快手缓存清理方法
Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】
win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】
Final Cut Pro视频加EQ教程
优化Google Charts Gauge:在数据库无数据时显示默认值
抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?
CDR如何复制交互式填充色
鸣潮历史学家灯塔位置一览
2025-12-20
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。