[英]What is the evaluation order of function arguments?
我正在使用這個版本的 Go:
$ go version
go version go1.18 windows/amd64
當struct A
只有一個字段和B
有兩個或以上字段時結果是不同的,而且只有當參數類型是interface時才會出現這種情況。
我不確定這是否是一個錯誤:
package main
import (
"fmt"
)
func main() {
a := A{}
m("A", a, SetAI(&a))
b := B{}
m("B", b, SetBI(&b))
}
type A struct {
I int
S string
}
type B struct {
I int
}
func SetAI(a *A) A {
a.I = 10
return *a
}
func SetBI(b *B) B {
b.I = 10
return *b
}
func m(name string, arg1, arg2 interface{}) {
fmt.Println(name+":", arg1, arg2)
}
我期待這個 output:
A: {10} {10}
B: {10} {10}
相反,我得到了這個:
A: {0 } {10 }
B: {10} {10}
混淆的來源和output不同的是arguments的求值順序。
看看你的例子:
m("A", a, SetAI(&a))
這是一個 function調用,function 值和 arguments按通常順序計算:
否則,在計算表達式、賦值或返回語句的操作數時,所有 function 調用、方法調用和通信操作都按詞匯從左到右的順序計算。 例如,在(函數局部)賦值
y[f()], ok = g(h(), i()+x[j()], <-c), k()
function 調用和通信按順序發生
f()
、h()
、i()
、j()
、<-c
、g()
和k()
。 但是,與x
的評估和索引以及y
的評估相比,這些事件的順序未指定。
所以基本上規范只保證 function 調用和通信操作從左到右發生。
您的電話有 arguments "A"
、 a
和SetAI(&a)
。 無法保證第二個參數a
是否在傳遞給SetAI()
的&a
參數之前被求值,這非常重要,因為SetAI()
修改a
。 由於無法保證順序,因此您不能依賴首先評估哪個順序,這兩個順序均符合規范。
如果通過復制 struct before使評估顯式,您會得到相同的結果:
a := A{}
aCopy := a
m("A", aCopy, SetAI(&a))
b := B{}
bCopy := b
m("B", bCopy, SetBI(&b))
這將是 output(在Go 游樂場上試試):
A: {0 } {10 }
B: {0} {10}
或者,如果您希望首先評估 function 調用:
a := A{}
ap := SetAI(&a)
m("A", a, ap)
b := B{}
bp := SetBI(&b)
m("B", b, bp)
這將為每個案例 output 10
(在Go 游樂場試試這個):
A: {10 } {10 }
B: {10} {10}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.