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
。