2017-01-23 68 views
0

我一直在學習Go,而對我來說突出的一點是,類型斷言的行爲根據捕獲的返回值的數量而變化:根據返回參數的數量改變行爲,如類型斷言

var i interface{} = "hello" 

val, ok := i.(int) // All good 
fmt.Println(val, ok) 

val = i.(int) // Panics 
fmt.Println(val) 

這種感覺就像是一種對用戶定義的功能非常有用的模式。用戶必須明確地獲得「ok」第二個返回值或使用下劃線忽略它。無論哪種情況,他們都明確表示他們意識到該功能可能會失敗。而如果他們只獲得一個返回值,它可能會默默地失敗。因此,如果用戶沒有檢查錯誤(如果錯誤應該「從未」發生,這將是合理的),恐慌或類似情況似乎是合理的。我認爲這是語言開發人員使類型斷言以這種方式工作的邏輯。

但是,當我試圖找出如何做到這一點,我什麼也沒有找到。我知道類型斷言不是一個實際的函數。許多具有多個返回值的語言不能檢查實際使用的返回值有多少(MATLAB是我唯一知道的),但是再一次,大多數語言不使用類型斷言所示的行爲。

那麼,有可能,如果是這樣,如何?如果沒有,儘管可以使用內置的類型斷言,但是這種行爲被排除在外是否有特殊原因?

+0

不能編譯分配了錯誤的數字代碼的返回值,所以我不確定你的建議是什麼。錯誤不是「永遠不會發生」的條件,即使在正常情況下也會一直返回並處理錯誤。 – JimB

回答

1

很遺憾,它們不能用於正常功能。據我所知只有類型斷言,地圖值訪問和範圍允許它。

通常當你想擁有一個功能與一個和可選的第二個錯誤的說法你的名字他們像

func DoSomething() (string, error) {...} // i will return an error 
func MustDoSomething() string {...} // i will panic 

一個例子是https://golang.org/pkg/regexp/#MustCompile