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)
}
Choices:
Answer: 102
Run it on Go play.
Key points:
Bar
is pushed into the deferred call queue,
its arguments MakeFoo(p)
(as the receiver argument) and p
are evaluated.
In evaluating MakeFoo(p)
, 1
is printed.
Bar
function call is still a pointer to the variable x
.
A similar quiz:
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)
}
The above quiz program prints 1342
.