首頁 > 後端開發 > Golang > 為什麼 Go 中禁止使用類型約束的介面?

為什麼 Go 中禁止使用類型約束的介面?

Patricia Arquette
發布: 2024-11-07 04:12:03
原創
1044 人瀏覽過

Why Are Interfaces with Type Constraints Forbidden in Go?

介面類型約束:理解並避免「類型約束」錯誤

在Go 中,介面是強大的構造,它定義了一組方法,類型必須實作。然而,並非所有介面都是一樣的。包含類型約束的介面對其使用施加了額外的限制。

考慮以下型別定義:

type Number interface {
    int | int64 | float64
}
登入後複製

此介面定義了可以表示 int、int64 或 float64 的 Number 類型。然而,Go 語言規範明確禁止在除類型參數約束之外的任何上下文中使用具有類型元素的此類介面。

當您嘗試將介面與在其他場景中鍵入元素。例如,下面的程式碼片段將無法編譯:

type NumberSlice []Number // interface contains type constraints

func main() {
    a := []Number{Number(1), Number(2), Number(3), Number(4)} // cannot use interface Number in conversion
}
登入後複製

此錯誤是因為 Number 是一個有類型約束的接口,因此不能用作切片的元素類型。

與類型元素的介面類似,嵌入類似或其他非基本介面的介面也是非基本的。為了避免這些錯誤,請確保您的介面僅包含方法或嵌入基本介面。

基本和非基本介面範例:

  • 基本:僅方法

    type A1 interface {
      GetName() string
    }
    登入後複製
type B1 interface {
  A1
  SetValue(v int)
}
登入後複製
非基本:嵌入可比較
  • type Message interface {
      comparable
      Content() string
    }
    登入後複製
  • 非基本:具有類型元素(聯合)
  • type Number interface {
      int | int64 | float64
    }
    登入後複製
  • 非基本:嵌入非基本介面
  • type SpecialNumber interface {
      Number
      IsSpecial() bool
    }
    登入後複製
  • 對使用類型約束的介面的正確使用

    有型別約束的介面只能用作型別參數限制。例如:

    在此場景中,介面用於限制泛型類型和函數允許的類型。
    type Coordinates[T Number] struct {
        x, y T
    }
    
    func sum[T Number](a, b T) T {
        return a + b
    }
    登入後複製

    以上是為什麼 Go 中禁止使用類型約束的介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    來源:php.cn
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    作者最新文章
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板