[英]Go: Type assertions on structs?
package main
import "fmt"
type Number int
func (n *Number) IncreaseMe(i int) {
*n += i
}
func main() {
n := Number(10)
n.IncreaseMe(90) // n is now supposed to be 100
fmt.Println(n)
}
運行上面的代碼時,它給我錯誤信息
無效操作:* n + = i(數字和整數類型不匹配)
這是可以預期的,因為它試圖對不共享同一類型的變量進行數學運算。
然后我嘗試了
*n.(int) += i
告訴編譯器不要擔心,因為* n可以安全地視為整數,這導致我
invalid type assertion: n.(int) (non-interface type *Number on left)
我相信這是因為類型斷言僅適用於接口,不適用於自定義類型。
那么解決方案是什么?
如“ 轉到:命名類型斷言和轉換 ”中所述
類型斷言僅適用於接口。 接口可以具有任意基礎類型,因此我們可以進行類型聲明和類型轉換。
您不需要類型斷言:您可以:
*n
轉換為int
: int(*n)
(因為您完全了解實際類型)。 轉換回Number
*n = Number(int(*n) + i)
參見此play.golang.org :輸出為100。
Go將“廣播”的概念分為兩個單獨的概念:
- 一個(“類型轉換”)用於編譯器知道正確的轉換,以及
- 一個(“類型斷言”)用於必須在運行時檢查的轉換。
后者僅適用於接口,因為只有接口在運行時具有編譯時不知道的其他類型信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.