package main
type Foo struct {
v int
}
func MakeFoo(n *int) Foo {
print(*n)
return Foo{}
}
func (Foo) Bar(n *int) {
print(*n)
}
func main() {
var x = 1
var p = &x
defer MakeFoo(p).Bar(p) // line 19
x = 2
p = new(int) // line 21
MakeFoo(p)
}
选项:
答案:102
(在线运行之)
关键点:
Bar
调用被推入延迟调用队列时,它的属主实参 MakeFoo(p)
和普通实参 p
被估值。
在估值(即调用) MakeFoo(p)
时,将打印出 1
。
p
的修改不影响上述估值结果。
这意味着传递给 Bar
调用的普通实参依旧是一个指向变量 x
的指针。
一个类似的测验:
package main
type T int
func (t T) M(n int) T {
print(n)
return t
}
func main() {
var t T
defer t.M(1).M(2)
t.M(3).M(4)
}
上面这个程序打印出 1342
。
Go101.org网站内容包括Go编程各种相关知识(比如Go基础、Go优化、Go细节、Go实战、Go测验、Go工具等)。后续将不断有新的内容加入。敬请收藏关注期待。
本丛书微信公众号(联系方式一)名称为"Go 101"。二维码在网站首页。此公众号将时不时地发表一些Go语言相关的原创短文。各位如果感兴趣,可以搜索关注一下。
《Go语言101》系列丛书项目目前托管在Github上(联系方式二)。欢迎各位在此项目中通过提交bug和PR的方式来改进完善《Go语言101》丛书中的各篇文章。我们可以在项目目录下运行go run .
来浏览和确认各种改动。
本书的twitter帐号为@Golang_101(联系方式三)。玩推的Go友可以适当关注。
你或许对本书作者老貘开发的一些App感兴趣。
(更多测验将不断被加入 ......)