Go 中具有使用者定義相等性的自訂映射鍵
在Go 中,映射對映射鍵採用嚴格的可比較語意。這意味著程式設計師無法像在其他語言中那樣實作自己的雜湊函數和映射鍵的相等操作。
要解決此限制,請考慮另一種方法。不要直接使用結構體實例作為鍵,而是使用結構體的衍生屬性作為適當的映射鍵並遵守所需的相等語意。在許多情況下,派生整數或字串值作為表示實例身分的雜湊碼是可行的。
確保派生雜湊碼中的衝突僅在表明實例的真實語義身分時才會發生,這一點至關重要儲存的值。這意味著相應的值應該是可以互換的。
例如:
type Key struct { a *int } func (k *Key) HashKey() int { return *(*k).a } k1, k2 := Key{intPtr(1)}, Key{intPtr(2)} m := map[int]string{} m[k1.HashKey()] = "one" m[k2.HashKey()] = "two" // m = map[int]string{1:"one", 2:"two"} m[k1.HashKey()] // => "one"
但是,在使用這種方法時要注意不變性問題。如果修改了上例中的 a 字段,則該實例就不能再作為哈希鍵,因為它的身份已經改變。
以上是如何在 Go 中實現映射鍵的自訂相等性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!