簡體   English   中英

前往:在結構上輸入斷言?

[英]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轉換為intint(*n) (因為您完全了解實際類型)。
  • 進行添加
  • 轉換回Number

     *n = Number(int(*n) + i) 

參見此play.golang.org :輸出為100。


正如ruakh 在評論中提到

Go將“廣播”的概念分為兩​​個單獨的概念:

  • 一個(“類型轉換”)用於編譯器知道正確的轉換,以及
  • 一個(“類型斷言”)用於必須在運行時檢查的轉換。

后者僅適用於接口,因為只有接口在運行時具有編譯時不知道的其他類型信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM