亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中使用包含切片字段的結構作為映射鍵的慣用方法是什么?

在 Go 中使用包含切片字段的結構作為映射鍵的慣用方法是什么?

Go
精慕HU 2021-10-04 15:33:04
我有一個包含切片的結構,我想將它用作映射的鍵。我知道這是不允許的,因為當前沒有為 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. 的建議,以及對哈希值的某種記憶以及某種跟蹤何時需要重新計算的方法。


查看完整回答
反對 回復 2021-10-04
?
翻閱古今

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)

}


查看完整回答
反對 回復 2021-10-04
  • 2 回答
  • 0 關注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號