package main
type Foo struct {
v int
}
func NewFoo(n *int) Foo {
print(*n)
return Foo{}
}
func (Foo) Bar(n *int) {
print(*n)
}
func main() {
var x = 1
var p = &x
defer NewFoo(p).Bar(p)
x = 2
p = new(int)
NewFoo(p)
}
Choices:
Answer: 102
Run it on Go play.
Key points:
Bar
is pushed into the deferred call stack,
its arguments NewFoo(p)
(as the receiver argument) and p
are evaluated.
In evaluating NewFoo(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
.