我有一個包含切片的結構,我想將它用作映射的鍵。我知道這是不允許的,因為當前沒有為 Go 中的切片定義相等性。我也知道我不能覆蓋結構的相等性來手動進行切片比較。我的問題是:在這里完成我想要做的事情的最慣用的方法是什么?這是一些示例代碼,使結構更加清晰:package mainimport "fmt"type InternalStruct struct { item1, item2 bool}type ContainerStruct struct { internals []InternalStruct}func main() { container1 := ContainerStruct{} container1.internals = append(container1.internals, InternalStruct{item1: true}) container2 := ContainerStruct{} container2.internals = append(container2.internals, InternalStruct{item1: true}) m := make(map[ContainerStruct]int) m[container1] = 10 fmt.Printf("container1 maps to: %d\n", m[container1]) fmt.Printf("container1 maps to: %d\n", m[container2])}這段代碼不能編譯(如預期的那樣),但我正在尋找可以輸出“10”兩次的等效代碼。實現這一結果的最佳方法是什么?
2 回答

qq_笑_17
TA貢獻1818條經驗 獲得超7個贊
即使您根據“相同的 ptr、cap 和 len”定義了切片相等性,您想要的仍然無法正常工作,因為示例中的切片指向不同的底層內存,因此需要進行深入分析并破壞速度地圖訪問。
即使有一個調用的接口Hasher
,您可以實現并使您的類型可映射,您的示例仍然需要逐個元素檢查、結果哈希的記憶以及跟蹤切片是否已更改的某種方法。我可能會建議您只使用 a map[*ContainerStruct]int
并處理這樣一個事實,即從概念上講,您可能有兩個不同的結構指針,它們的切片成員具有相同的數據。
鑒于所有這些,我可能會建議首先重新構建架構,如果失敗,則采用上面 Dave C. 的建議,以及對哈希值的某種記憶以及某種跟蹤何時需要重新計算的方法。

翻閱古今
TA貢獻1780條經驗 獲得超5個贊
您不能使用切片作為映射鍵,但如果您知道此類切片的大小,則可以改用數組。允許數組作為映射鍵。
package main
import "fmt"
func main() {
m := make(map[[2]int]int)
m[[2]int{1, 2}] = 3
m[[2]int{3, 4}] = 1
fmt.Println(m)
}
- 2 回答
- 0 關注
- 218 瀏覽
添加回答
舉報
0/150
提交
取消