上一篇: [链接] ToC [链接] [链接] [链接] [链接] [链接] [链接] Go 边看边练 -《Go 学习笔记》系列(七)- 错误处理 Go 边看边练 -《Go 学习笔记》系列(八)- 数组、切片 Go 边看边练 -《Go 学习笔记》系列(九)- Map、结构体 Go 边看边练 -《Go 学习笔记》系列(十 ..

Go 边看边练 -《Go 学习笔记》系列(十一)

本贴最后更新于 1360 天前,其中的信息可能已经渤澥桑田

上一篇: Go 边看边练 -《Go 学习笔记》系列(十)


ToC


5.4 表达式

根据调用者不同,方法分为两种表现形式:

instance.method(args...) ---> <type>.func(instance, args...)

前者称为 method value,后者 method expression

两者都可像普通函数那样赋值和传参,区别在于 method value 绑定实例,而 method expression 则须显式传参。

需要注意,method value 会复制 receiver

在汇编层面,method value 和闭包的实现方式相同,实际返回 FuncVal 类型对象。

FuncVal { method_address, receiver_copy }

可依据方法集转换 method expression,注意 receiver 类型的差异。

将方法 "还原" 成函数,就容易理解下面的代码了。

type Data struct{}

func (Data) TestValue() {}
func (*Data) TestPointer() {}

func main() {
	var p *Data = nil
	p.TestPointer()
	
    (*Data)(nil).TestPointer() // method value
	(*Data).TestPointer(nil) // method expression
	
    // p.TestValue() // invalid memory address or nil pointer dereference
	// (Data)(nil).TestValue() // cannot convert nil to type Data
	// Data.TestValue(nil) // cannot use nil as type Data in function argument
}

下一篇: Go 边看边练 -《Go 学习笔记》系列(十二)



社区小贴士

  • 关注标签 [golang] 可以方便查看 Go 相关帖子
  • 关注作者后如有新帖将会收到通知

打赏 50 积分后可见  
50 积分 • 1 打赏
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    320 引用 • 1158 回帖 • 731 关注
  • 教程
    78 引用 • 344 回帖 • 3 关注
  • 雨痕
    14 引用 • 62 回帖 • 3 关注
4 回帖   
请输入回帖内容...
  • Vanessa  

    更新好快, [1437497122181] 都還沒看完呢

  • yangyujiao  

    @Vanessa 你应该回家直接让大 D 给你讲,然后边演示边说。

  • Vanessa  

    @yangyujiao 怕孩子聽到不好

  • ZYShang  

    写的很好,谢谢