亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

函數參數的求值順序是什么?

函數參數的求值順序是什么?

Go
哆啦的時光機 2022-11-28 10:42:56
我正在使用這個版本的 Go:$ go versiongo version go1.18 windows/amd64當structA只有一個字段和B有兩個或以上字段時結果不同,而且只有當參數類型是interface時才會出現這種情況。我不確定這是否是一個錯誤:package mainimport (    "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)}我期待這個輸出:A: {10} {10}B: {10} {10}相反,我得到了這個:A: {0 } {10 }B: {10} {10}
查看完整描述

1 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

混淆和不同輸出的根源是參數的評估順序。

看看你的例子:

m("A", a, SetAI(&a))

這是一個函數調用,函數值和參數按通常的順序求值:

否則,在計算表達式、賦值或返回語句的操作數時,所有函數調用、方法調用和通信操作均按從左到右的詞匯順序進行計算。例如,在(函數局部)賦值

y[f()], ok = g(h(), i()+x[j()], <-c), k()

函數調用和通信的順序為f()h()i()j()<-cg(), 和k()但是,與評估和索引以及評估相比,這些事件的順序未指定。xy

所以基本上規范只保證函數調用和通信操作從左到右發生。

你的電話有參數"A",aSetAI(&a)。無法保證第二個參數是否在傳遞給a的參數之前被求值,這非常重要,因為會修改。由于無法保證順序,因此您不能依賴首先評估哪個順序,這兩個順序均符合規范。&aSetAI()SetAI()a

如果通過復制 struct before使評估顯式,您會得到相同的結果:

a := A{}

aCopy := a

m("A", aCopy, SetAI(&a))

b := B{}

bCopy := b

m("B", bCopy, SetBI(&b))

這將輸出(在Go Playground上嘗試):


A: {0 } {10 }

B: {0} {10}

或者,如果您希望首先評估函數調用:


a := A{}

ap := SetAI(&a)

m("A", a, ap)

b := B{}

bp := SetBI(&b)

m("B", b, bp)

這將為每個案例輸出(在Go Playground10上試試這個):


A: {10 } {10 }

B: {10} {10}


查看完整回答
反對 回復 2022-11-28
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號