我無法理解為什么類型開關是用 switch 語句中定義的附加變量編寫的。下面的代碼似乎是被認可的做事方式:func test_func(i interface{}) { switch v := i.(type) { case int: fmt.Printf("%T\n", v) case float64: fmt.Printf("%T\n", v) case int: fmt.Printf("I don't know about type %T!\n", v) }}func main() { test_func(float64(34)) test_func(int(34)) test_func("hello world")}正如預期的那樣,這將返回:float64intI don't know about type string!但是,我可以test_func稍微改變一下,這樣v就不會在語句中定義switch,而是i在我們的 case 語句中使用:func test_func(i interface{}) { switch i.(type) { case int: fmt.Printf("%T\n", i) case float64: fmt.Printf("%T\n", i) case int: fmt.Printf("I don't know about type %T!\n", i) }}func main() { test_func(float64(34)) test_func(int(34)) test_func("hello world")}并且輸出沒有改變。這兩種形式似乎可以互換。為什么我要麻煩地定義v什么時候可以使用i?后一種情況更簡單,因為需要跟蹤的變量更少;也許它的性能更高。
1 回答

慕妹3146593
TA貢獻1820條經驗 獲得超9個贊
它們不可互換;你只是傳遞i
給一個可以接受它的函數,而不管它的類型(fmt.Printf
格式字符串之后的參數是類型interface{}
)。i
仍然是它的原始類型,因為變量的類型不能改變。
如果你真的想根據它的類型對它做些什么,你需要第一種形式,這樣它v
就是語句中的類型case
。無論您是否將鍵入的值分配給變量,原始變量i
都會保留其原始類型。
- 1 回答
- 0 關注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消