亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在 Go 類型開關中聲明一個單獨的變量?

為什么在 Go 類型開關中聲明一個單獨的變量?

Go
largeQ 2023-06-19 13:55:26
我無法理解為什么類型開關是用 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都會保留其原始類型。

查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號