总结
- go是值复制语言,任何时候都是复制操作
type P struct {
Name string
Age int
}
func main() {
o := []P{
P{"chain1", 20},
P{"chain2", 21},
P{"chain3", 22},
}
oPointer := make([]*P, 0, 3)
for _, v := range o {
oPointer = append(oPointer, &v)
}
fmt.Println(oPointer)
for _, v := range oPointer {
fmt.Println(v)
}
}
结果: &P{"chain3", 22} 打印三遍,并且并不是o中的元素地址 原因: v是给定一个地址,逐个从切片里值复制出来的
package main
import "fmt"
func f() int {
n := 0
defer func() {
n++
}()
return n
}
func g() (n int) {
defer func() {
n++
}()
return n
}
func main() {
fmt.Printf("f() == %d\n", f())
fmt.Printf("g() == %d\n", g())
}
结果: 0 ,1 原因: 同上,值复制的原因