我注意到 Go 斷言對于零 int 并不像我預期的那樣工作。這是代碼:var i interface{}i = 0i32, ok := i.(int32)fmt.Println(ok)fmt.Println(i32)輸出如下:false0我找不到這種行為的解釋。這是一個錯誤嗎?
2 回答
蝴蝶刀刀
TA貢獻1801條經驗 獲得超8個贊
i不包含 an?int32,它包含 an?int,因此類型斷言失敗。
像這樣直接將文字值分配給一個字面值interface{}或在簡短的變量聲明中使用一個字面值可能會有點令人困惑,因為您實際上無法看到所獲得的值的類型;您需要了解常量“默認類型”的規則。如果這給您帶來麻煩,您可以將其顯式轉換為類型,例如?i = int32(0),這將確保i確實包含int32.
蕪湖不蕪
TA貢獻1796條經驗 獲得超7個贊
不,這不是一個錯誤,這是一個定義明確的行為。
這行:
i?=?0
是一個賦值,并且您使用無類型0整型常量來賦值i。由于需要一個(具體)類型來執行賦值(并且is 類型interface{}沒有定義類型),因此將使用該無類型常量的默認類型,即int。
答案是,無類型常量有一個默認類型,即一種隱式類型,如果需要類型而未提供類型,則會將其轉換為值。
修改如下即可驗證:
i2, ok := i.(int)
fmt.Println(ok)
fmt.Println(i2)
哪個輸出:
true
0
如果您要使用類型常量:
i = int32(0)
那么是的,存儲的值將是 類型int32,并且您將得到相同的輸出:
i = int32(0)
i32, ok := i.(int32)
fmt.Println(ok)
fmt.Println(i32)
嘗試Go Playground上的示例。
- 2 回答
- 0 關注
- 200 瀏覽
添加回答
舉報
0/150
提交
取消
