我注意到 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
。由于需要一個(具體)類型來執行賦值(并且i
s 類型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 關注
- 184 瀏覽
添加回答
舉報
0/150
提交
取消