golang多返回值的估值顺序
问题
问题代码:
m := map[string]int{"Go": 0}
s := []int{1, 1, 1}
olds := s
n := 2
p := &n
s, m["Go"], *p, s[n] = []int{2, 2, 2}, s[1], m["Go"], 5
fmt.Println(m, s, n) // map[Go:1] [2 2 2] 0
fmt.Println(olds) // [1 1 5]
有大佬能说说上述代码的估值顺序吗,具体是怎么估值的呀,看了<<GO101>>书里边看到的案例,但是不感觉还是说的不太清楚。
分析
目前明确的估值顺序好像有:
- 方法、通道、函数的估值按照调用顺序进行
- 包变量具有依赖时先对依赖进行估值,不存在依赖的两个变量估值顺序取决于编译器实现
上述代码s与s[n]的顺序是不是也是取决于编译器而展现出不一致吗?还是说有有其他的说法?
git hub issue:github.com/golang/go/issues/15620