2016-11-29 106 views
1

爲什麼go有時候允許你調用函數而不捕獲兩個返回值?如:Golang:爲什麼要捕獲某些函數返回值可選?

func TestGolang() { 
    myMap := make(map[string]string) 
    test := myMap["value"] 
    // or 
    test, success := myMap["value"] 
} 

而在其他時候,您需要捕獲所有返回結果並使用空白標識符,如果您不想使用該值?

test := os.Stat("test") // fails 
test, _ := os.Stat("test") // only way to make it work 

我認爲golang不支持單個函數的不同方法簽名。第一個例子如何工作?我是否可以實現自己的函數,可選地返回錯誤或狀態標誌,但是如果第二個返回值沒有被捕獲,則不會錯誤輸出?

+5

這不是可有可無的,這是一個通吃或無。 [在Golang返回圖像「OK」上的正常功能(可能的重複http://stackoverflow.com/questions/28487036/return-map-like-ok-in-golang-on-normal-functions/28487270#28487270 ) – icza

+1

太糟糕了,Go有自己奇怪的技巧,用戶甚至無法重現。它經常覺得Go是「作弊」。 – mpm

回答

7

事實上,golang不支持函數重載,所以你不能爲一個函數定義不同的簽名。但是,語言定義中的某些操作(如頻道接收器或從地圖獲取數據)會因類似超載的行爲而「受益」。

+0

如需更詳細的信息,你可以看看這個答案:http://stackoverflow.com/questions/6986944/does-the-go-language-have-function-method-overloading –

+3

這是正確的。許多在語言定義的操作(特別是,輸入的斷言,映射值的檢索,以及信道接收,雖然有可能是其它我遺忘)同時具有一個和兩個值「版本」,與第二(可選)值,指示操作的「狀態」(以及在類型斷言的情況下,如果失敗也可以防止恐慌)。但是,請注意,任何函數都可以通過忽略隱含忽略的* all *返回值來調用:https://play.golang.org/p/qdbcw5JtVK – Kaedys