编程范式游记
陈皓(网名“左耳朵耗子”)
资深技术专家
立即订阅
2 人已学习
课程目录
已更新 11 讲 / 共 11 讲
01 | 编程范式游记:起源
免费
02 | 编程范式游记:泛型编程
03 | 编程范式游记:类型系统和泛型的本质
04 | 编程范式游记:函数式编程
05 | 编程范式游记:修饰器模式
06 | 编程范式游记:面向对象编程
07 | 编程范式游记:基于原型的编程范式
08 | 编程范式游记:Go 语言的委托模式
09 | 编程范式游记:编程的本质
10 | 编程范式游记:逻辑编程范式
11 | 编程范式游记:程序世界里的编程范式
编程范式游记
登录|注册

08 | 编程范式游记:Go 语言的委托模式

陈皓 2019-07-16
我们再来看 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编程范式游记》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(1)

  • Transient
    Control 部分只是影响 Logic 部分的效率。我觉得这句话后面还可以加上一句话就是,同时也可以增加代码的可读性,在效率相差不大的情况下,降低效率来增加可读性是非常有必要的。
    2019-08-01
    1
收起评论
1
返回
顶部