首頁  >  文章  >  後端開發  >  你能阻止一個類型在 Go 中被用作 Map Key 嗎?

你能阻止一個類型在 Go 中被用作 Map Key 嗎?

Linda Hamilton
Linda Hamilton原創
2024-10-27 09:06:30956瀏覽

 Can You Prevent a Type from Being Used as a Map Key in Go?

防止類型用作映射鍵

雖然擁有可用作映射鍵的類型通常是有益的,但在某些情況下,可能有必要限制其使用。雖然假設類型中存在私有成員會阻止其在定義包之外用作映射鍵是一種常見的誤解,但實際上,它並沒有提供此類保護。

防止映射鍵使用的最佳方法

防止類型被用作映射鍵的最有效方法是違反映射類型規範,該規範要求鍵類型必須啟用以下定義:比較運算子(== 和!= )。透過在類型被認為不可比較的類型(例如切片或函數)中合併字段,您可以有效地禁止將其用作映射鍵。

考慮以下範例:

type MyType struct {
    S             string
    i             int
    notComparable []int
}

嘗試使用MyType 作為映射鍵:

m := map[MyType]int{}

會導致編譯時錯誤:

invalid map key type MyType

阻止映射鍵使用的後果

需要注意的是,透過採取這種措施,您將喪失使用比較運算子來比較您的類型的值的能力。例如,以下程式碼將不再起作用:

p1, p2 := MyType{}, MyType{}
fmt.Println(p1 == p2)

編譯時錯誤:

invalid operation: p1 == p2 (struct containing []int cannot be compared)

保留可比較

如果您如果希望保留類型的可比較性,同時防止將其用作映射鍵,則可以採用涉及嵌入和包裝類型的技術。例如:

type myType struct {
    S string
    i int
}

type MyType struct {
    myType
    notComparable []int
}

透過這種方法,myType 保持可比性,而導出的包裝類型 MyType 不能用作映射鍵。

以上是你能阻止一個類型在 Go 中被用作 Map Key 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn