// 示范1:
func getAddFunc() func() int {
i := 0
return func() int {
i++
return i
}
}
func main() {
f1 := getAddFunc()
fmt.Println(f1()) // 1
fmt.Println(f1()) // 2
f2 := getAddFunc()
fmt.Println(f2()) // 1
fmt.Println(f2()) // 2
}
// 示范2:
func main() {
wg := sync.WaitGroup{}
wg.Add(5)
for i := 0; i < 5; i++ {
go func() {
println(i)
wg.Done()
}()
}
wg.Wait()
}
// 最后输出:不一定,根据goroutine调度有关,可能是55555、45555、34555、35555等
值传递引用传递问题:接收器如果不是指针,也是值传递,而不是引用传递
代码语言:javascript代码运行次数:0运行复制
type user struct {
name string
}
// 接收器是值传递而不是引用传递,所以原对象的字段值不会改变
func (u user) setUserNameByVal(name string) {
u.name = name
}
// 使用指针作为接收器,引用的是原对象,所以会修改原对象的字段值
func (u *user) setUserNameByPtr(name string) {
u.name = name
}
func main() {
u := user{name: "old name"}
fmt.Println(u) // {old name}
u.setUserNameByVal("new name by val")
fmt.Println(u) // {old name}
u.setUserNameByPtr("new name by ptr")
fmt.Println(u) // {new name by ptr}
}
// 示范1:
var bigArr [10000]int
for i, v := range bigArr { // 此处相当于拷贝了一份bigArr
// do something
}
// 示范2:
var bigArr [10000]int
for i, v := range bigArr[0:] { // 此处相当于拷贝了一份bigArr[0:]的slice
// do something
}