左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180928 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

37 | 编程范式:Go语言的委托模式

Undo()
Add()
Undo()
Delete()
Add()
NewUndoableIntSet()
String()
Contains()
Delete()
Add()
NewIntSet()
Click()
Paint()
Click()
Paint()
NewButton()
Paint()
Undo
UndoableIntSet
IntSet
Clicker
Painter
ListBox
Button
Label
Widget
一个 Undo 的委托重构
扩展代码
委托的简单示例
左耳朵耗子的编程范式游记(8)- Go 语言的委托模式

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
我们再来看 Go 语言这个模式,Go 语言的这个模式挺好玩儿的。声明一个 struct,跟 C 很一样,然后直接把这个 struct 类型放到另一个 struct 里。

委托的简单示例

我们来看几个示例:
type Widget struct {
X, Y int
}
type Label struct {
Widget // Embedding (delegation)
Text string // Aggregation
X int // Override
}
func (label Label) Paint() {
// [0xc4200141e0] - Label.Paint("State")
fmt.Printf("[%p] - Label.Paint(%q)\n",
&label, label.Text)
}
由上面可知:
我们声明了一个 Widget,其有 XY
然后用它来声明一个 Label,直接把 Widget 委托进去;
然后再给 Label 声明并实现了一个 Paint() 方法。
于是,我们就可以这样编程了:
label := Label{Widget{10, 10}, "State", 100}
// X=100, Y=10, Text=State, Widget.X=10
fmt.Printf("X=%d, Y=%d, Text=%s Widget.X=%d\n",
label.X, label.Y, label.Text,
label.Widget.X)
fmt.Println()
// {Widget:{X:10 Y:10} Text:State X:100}
// {{10 10} State 100}
fmt.Printf("%+v\n%v\n", label, label)
label.Paint()
我们可以看到,如果有成员变量重名,则需要手动地解决冲突。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go 语言的委托模式是本文的重点内容,通过示例展示了在 Go 语言中如何使用委托模式进行编程。文章首先介绍了简单的委托示例,然后扩展到了包含按钮和列表框的更复杂的示例。接着,文章讨论了如何利用泛型编程、函数式编程和控制反转等编程范式来实现 Undo 功能,展示了如何将 Undo 的流程抽象出来,而具体的 Undo 操作交给业务代码来维护。这种方式类似于 C++ 的泛型编程和 map、reduce、filter 等控制流程的实现方式,同时也体现了控制反转的思想。整体而言,本文通过具体的示例和代码展示了 Go 语言中委托模式的应用,以及如何结合多种编程范式实现功能扩展和抽象,为读者提供了深入理解和应用委托模式的思路和方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • milley
    这样的代码和思维只能说赏心悦目!
    2018-02-06
    39
  • 小文同学
    1、文章说了什么? 文章分了两部分,一部分先简单说了 Golang 的委托用法。简单来说,就是讲一个 structA 嵌套到另外一个 structB 中,structB 会自动继承 structA 的字段。其后,通过一个更加复杂的例子说明委托的用法。(作为一个 Java 程序员,Golang 为 struct 增加方法,和定义接口的方法让人印象深刻) 另一部分,作者举了一个更加复杂的例子说明 Go 中委托和接口多态是如何实现一个数据容器的 Undo 实现的。为了说明这部分,作者通过以下步骤一说说进阶说明: 1、最简单的一个 IntSet,并定义了 Add ,Delete 方法; 2、通过一个委托的方法,将 IntSet 委托给一个新的 struct,新 struct 再重写一次 Add,Delete 方法以记录步骤(保存Undo函数对象),完成 Undo 功能; 3、最后作者希望可以进一步改写,编写一个 Undo 栈,委托给 IntSet ,并在 IntSet 编写 Add,Delete 的方法中就完成 Undo 函数对象的保存。这也是一个实现方法。
    2020-11-04
    10
  • Jie
    求教,最后那段代码执行undo的时候会继续添加undo函数,那样不就回不到最初的状态了?后续一直在撤销undo—撤销撤销undo……
    2020-11-11
    1
    4
  • 亢(知行合一的路上)
    依赖的东西要可靠、稳定,也就是接口。 业务与控制分离,控制就可以复用。 把变化频率不同的事物分开。
    2019-02-26
    4
  • 拉欧
    go里面这个undo功能的实现类似scala里面的trait,也是把一些功能模块(以及实现)单独封装起来,然后以委托或者继承的形式组装到类里面,这种灵活组装的方式确实比java的interface要更方便使用,不同语言之间是有共同点的
    2019-05-29
    3
  • 寻找的人cs
    web端功能多一点就好了,比如显示文章列表的时候感觉不如app端那么清爽
    2019-02-06
    3
  • Jacob.C
    再在undo里加个反撤销的功能,就更秀了
    2021-03-05
    2
  • 你为啥那么牛
    写了半年的go语言了,终于体会到go语言的美感了。那种只要会嘎嘎叫的,我就认为是一只🦆的境界。😃
    2020-09-15
    2
  • Z3
    sort.Ints(ints) parts := make([]string, 0, len(ints)) for _, i := range ints { 这块要sort吗? 能否直接for (i=0;i<len)print ints[i]
    2018-02-06
    2
  • 小虾米
    这样写的undo在第一次插入过后,可以无限撤销了吧
    2018-02-06
    1
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部