簡體   English   中英

function arguments的評價順序是什么?

[英]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()<-cg()k() 但是,與x的評估和索引以及y的評估相比,這些事件的順序未指定。

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

您的電話有 arguments "A"aSetAI(&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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM