2016-11-29 50 views
1

如何在多賦值語句中賦值結構體字段變量?請參閱下面的代碼。如何在多個賦值語句中分配結構字段變量

type TestMultipleReturns struct { 
    value string 
} 

func (t *TestMultipleReturns) TestSomething() { 
    someMap := make(map[string]string) 
    someMap["Test"] = "world" 
    t.value, exists := someMap["doesnotexist"] // fails 

    // works, but do I really need a 2nd line? 
    tmp, exists := someMap["doesnotexist"] 
    t.value = tmp 

    if exists == false { 
     fmt.Println("t.value is not set.") 
    } else { 
     fmt.Println(t.value) 
    } 
} 

回答

5

Short variable declaration不支持分配結構接收器屬性;它們在規格定義中被省略:

與常規變量聲明不同,短變量聲明可能會重新聲明提供它們最初在同一個塊中聲明的變量(或參數列表,如果塊是函數體)相同的類型,並且至少有一個非空白變量是新的。

解決辦法是分配之前定義exists並且不使用短變量聲明:

type TestMultipleReturns struct { 
    value string 
} 

func (t *TestMultipleReturns) TestSomething() { 
    someMap := make(map[string]string) 
    someMap["Test"] = "world" 
    var exists bool 
    t.value, exists = someMap["doesnotexist"] 

    if exists == false { 
     fmt.Println("t.value is not set.") 
    } else { 
     fmt.Println(t.value) 
    } 
} 
+0

謝謝,雖然它仍然是2行。這似乎與您可以有1個已定義變量和1個未定義,定義:= MultipleReturnCall()'''中定義的變量的行爲不一致。 Go的怪癖! – PressingOnAlways

+2

@PressingOnAlways:如果您認爲這只是規範作者的疏忽,我會鼓勵您[提交提案](https://github.com/golang/proposal)進行更改。 –

+0

我只是很高興它不需要* 3 *行! –