我試圖從[]Node
輸入斷言,至[]Symbol
。在我的代碼中,Symbol
實現了Node
接口。我可以鍵入斷言一片接口值嗎?
下面是一些周邊代碼:
43 func applyLambda(args []Node, env Env) Node {
44 if len(args) > 2 {
45 panic("invalid argument count")
46 }
47 fixed, rest := parseFormals(args.([]Symbol))
48 return Func{
49 Body: args[1],
50 FixedVarNames: fixed,
51 RestVarName: rest,
52 }
53 }
這是我得到的錯誤:
./builtins.go:47: invalid type assertion: args.([]Symbol) (non-interface type []Node on left)
我敢肯定有一個很好的理由。最好的方式是什麼?
我不同意你的說法「因此,假設一片界面值也是一個界面是沒有意義的」。轉化是轉化 - 界面是界面。他們是不同的概念(至少在我看來)。 Go作者可能已決定支持從[] Node到[] Symbol的轉換,但這並不是因爲代價太高,而且這種轉換不是常見的編程模式。從理論上講,任何不會產生矛盾或問題的轉換都是合理的 - 但語言設計師需要選擇將哪種轉換放入語言中。 – 2012-05-07 11:17:00
我無法確定Go作者怎麼看待這件事,但我仍然認爲我的假設是真實的。你說得對,這種轉換成本太高,但我認爲這不是違法的原因。正如我所說,在切片是一種類型。你可以說'輸入Nodes [] Node'。 Nodes是一種接口類型嗎?不,所以我看到這就是我們不能斷言'[] Node'類型變量的原因。你想在golang-nuts郵件列表上做這個討論嗎? – Mostafa
@Atom:這個問題並沒有提出有關轉換的問題。它會詢問類型斷言 – newacct