上一篇: [1438699210452]
ToC
- Go 边看边练 -《Go 学习笔记》系列(一)- 变量、常量
- Go 边看边练 -《Go 学习笔记》系列(二)- 类型、字符串
- Go 边看边练 -《Go 学习笔记》系列(三)- 指针
- Go 边看边练 -《Go 学习笔记》系列(四)- 控制流 1
- Go 边看边练 -《Go 学习笔记》系列(五)- 控制流 2
- Go 边看边练 -《Go 学习笔记》系列(六)- 函数
- Go 边看边练 -《Go 学习笔记》系列(七)- 错误处理
- Go 边看边练 -《Go 学习笔记》系列(八)- 数组、切片
- Go 边看边练 -《Go 学习笔记》系列(九)- Map、结构体
- Go 边看边练 -《Go 学习笔记》系列(十)- 方法
- Go 边看边练 -《Go 学习笔记》系列(十一)- 表达式
- Go 边看边练 -《Go 学习笔记》系列(十二)- 接口
- Go 边看边练 -《Go 学习笔记》系列(十三)- Goroutine
- Go 边看边练 -《Go 学习笔记》系列(十四)- Channel
5.4 表达式
根据调用者不同,方法分为两种表现形式:
1instance.method(args...) ---> <type>.func(instance, args...)
前者称为 method value
,后者 method expression
。
两者都可像普通函数那样赋值和传参,区别在于 method value
绑定实例,而 method expression
则须显式传参。
需要注意,method value
会复制 receiver
。
在汇编层面,method value
和闭包的实现方式相同,实际返回 FuncVal
类型对象。
1FuncVal { method_address, receiver_copy }
可依据方法集转换 method expression
,注意 receiver
类型的差异。
将方法 "还原" 成函数,就容易理解下面的代码了。
1type Data struct{}
2
3func (Data) TestValue() {}
4func (*Data) TestPointer() {}
5
6func main() {
7 var p *Data = nil
8 p.TestPointer()
9
10 (*Data)(nil).TestPointer() // method value
11 (*Data).TestPointer(nil) // method expression
12
13 // p.TestValue() // invalid memory address or nil pointer dereference
14 // (Data)(nil).TestValue() // cannot convert nil to type Data
15 // Data.TestValue(nil) // cannot use nil as type Data in function argument
16}
下一篇: [1438845728987]
- 本系列是基于雨痕的《Go 学习笔记》(第四版)整理汇编而成,非常感谢雨痕的辛勤付出与分享!
- 转载请注明:文章转载自:黑客与画家的社区 [http://symphony.b3log.org]
- 如果你觉得本章节做得不错,请在下面打赏一下吧~
社区小贴士
- 关注标签 [golang] 可以方便查看 Go 相关帖子
- 关注标签 [Go 学习笔记] 可以方便查看本系列
- 关注作者后如有新帖将会收到通知
该文章同步自 黑客派