最近在学go的defer,发现以下两个例子,但是不明白区别是什么?
package main
import "fmt"
type Test struct {
name string
}
func (t *Test) Close() {
fmt.Println(t.name, " closed")
}
func main() {
ts := []Test{{"a"}, {"b"}, {"c"}}
for _, t := range ts {
defer t.Close()
}
}
输出结果:
c closed
c closed
c closed
然后我们加一句代码:
package main
import "fmt"
type Test struct {
name string
}
func (t *Test) Close() {
fmt.Println(t.name, " closed")
}
func main() {
ts := []Test{{"a"}, {"b"}, {"c"}}
for _, t := range ts {
t2 := t //定义新变量t2 t赋值给t2
defer t2.Close()
}
}
结果是:
c closed
b closed
a closed
不知道哪位懂这个区别的不吝赐教,本人初学go语言。感谢!
其实等价与
因为for循环之后,t == Test{"c"},所以最后t.Close输出的都是c
等价于
这个代码里面,分别创建了3个t2,分别为a b c,所以分别调用Close,输出了a b c