一、顺序执行
func worker() chan int {
ch := make(chan int)
go func() {
time.Sleep(3 * time.Second)
ch <- 42
}()
return ch
}
func main() {
timeStart := time.Now()
_, _ = <-worker(), <-worker()
println(int(time.Since(timeStart).Seconds()))
}
stackoverflow.com/questions/6…
赋值分为两个阶段。首先,左侧的索引表达式和指针间接寻址(包括选择器中的隐式指针间接寻址)的操作数以及右侧的表达式均按通常顺序进行求值。其次,赋值按从左到右的顺序进行。
ch1, ch2 := worker(), worker()
_, _ = <-ch1, <-ch2
这样,输出将是(在Go Playground上尝试):
3
二、变量传递
func changePointer(p *int) {
v := 3
p = &v
}
func main() {
v := 5
p := &v
println(*p)
changePointer(p)
println(*p)
}
输出是:
5和5
原因是:
golang只可以值传递,即使传递的是int指针,传递的也是拷贝出来的指针。
func changePointer(p *int) {
*p = 3
}
func main() {
v := 5
p := &v
println(*p)
changePointer(p)
println(*p)
}
把指针里的值改变成3,可以做到返回3