我在golang專案中使用帶有嵌套地圖資料結構(map[string]map[string]map[string]string-map[ ip ]map[ port ]map[ path ]string)的IM快取,一個ip有一個埠,路徑值的多個組合可以添加到映射中,這里是關注點,我必須 從上面的嵌套映射值中洗掉ip,port,path的確切組合。下面我附上代碼。我打算從地圖中洗掉http://10.3.5.6:8080/path7 。
**package main
import "fmt"
type cacheData map[string]map[string]map[string]string
func main() {
cacheEntries := make(cacheData)
cacheEntries["http://10.3.5.6"] = make(map[string]map[string]string)
cacheEntries["http://10.3.5.6"]["8080"] = make(map[string]string)
cacheEntries["http://10.3.5.6"]["8080"]["/path7"] = "URL"
cacheEntries["http://10.3.5.7"] = make(map[string]map[string]string)
cacheEntries["http://10.3.5.7"]["8080"] = make(map[string]string)
cacheEntries["http://10.3.5.7"]["8080"]["/path7"] = "URL"
fmt.Println(cacheEntries)
delVal := make(map[string]map[string]string)
delVal["http://10.3.5.6"] = make(map[string]string)
delVal["http://10.3.5.6"]["8080"] = "/path7"
delete(cacheEntries, delVal)
fmt.Println(cacheEntries)
}**
上面的代碼拋出編譯錯誤說./prog.go:21:23: cannot use delVal (variable of type map[string]map[string]string) as type string in argument to delete,這是因為 delete 函式只需要洗掉的字串值。解決上述問題的任何建議或建議解決的任何其他方法,請告訴我。
提前致謝。
uj5u.com熱心網友回復:
首先,由于沒有條目“ /path”,我假設您的意思是“ /path7”
其次,要洗掉 map 中的鍵,您只需要參考現有的 map,而不是重新創建它。
看游樂場
package main
import "fmt"
type cacheData map[string]map[string]map[string]string
func main() {
cacheEntries := make(cacheData)
cacheEntries["http://10.3.5.6"] = make(map[string]map[string]string)
cacheEntries["http://10.3.5.6"]["8080"] = make(map[string]string)
cacheEntries["http://10.3.5.6"]["8080"]["/path7"] = "URL"
cacheEntries["http://10.3.5.7"] = make(map[string]map[string]string)
cacheEntries["http://10.3.5.7"]["8080"] = make(map[string]string)
cacheEntries["http://10.3.5.7"]["8080"]["/path7"] = "URL"
fmt.Println(cacheEntries)
delMap := cacheEntries["http://10.3.5.6"]["8080"]
delVal := "/path7"
delete(delMap, delVal)
fmt.Println(cacheEntries)
}
結果:
map[http://10.3.5.6:map[8080:map[/path7:URL]] http://10.3.5.7:map[8080:map[/path7:URL]]]
map[http://10.3.5.6:map[8080:map[]] http://10.3.5.7:map[8080:map[/path7:URL]]]
要洗掉精確的元組(IP、埠、路徑),請參見以下示例:
package main
import "fmt"
type cacheData map[string]map[string]map[string]string
func main() {
cacheEntries := make(cacheData)
cacheEntries["http://10.3.5.6"] = make(map[string]map[string]string)
cacheEntries["http://10.3.5.6"]["8080"] = make(map[string]string)
cacheEntries["http://10.3.5.6"]["8080"]["/path7"] = "URL"
cacheEntries["http://10.3.5.7"] = make(map[string]map[string]string)
cacheEntries["http://10.3.5.7"]["8080"] = make(map[string]string)
cacheEntries["http://10.3.5.7"]["8080"]["/path7"] = "URL"
fmt.Println(cacheEntries)
del("http://10.3.5.6", "8080", "/path7", cacheEntries)
fmt.Println(cacheEntries)
}
func del(ip, port, path string, cacheEntries cacheData) {
mapIP := cacheEntries[ip]
if mapIP == nil {
return
}
mapPort := mapIP[port]
if mapPort == nil {
return
}
delete(mapPort, path)
if len(mapPort) == 0 {
delete(mapIP, port)
}
if len(mapIP) == 0 {
delete(cacheEntries, ip)
}
}
結果:
map[http://10.3.5.6:map[8080:map[/path7:URL]] http://10.3.5.7:map[8080:map[/path7:URL]]]
map[http://10.3.5.7:map[8080:map[/path7:URL]]]
uj5u.com熱心網友回復:
地圖是否嵌套無關緊要。內置delete函式將地圖和鍵作為引數。
如果包含要洗掉的鍵的映射位于映射的 N 級深度映射中,則只需撰寫一個運算式,像往常一樣生成它:
delete(cacheEntries["http://10.3.5.6"]["8080"], "/path")
// ^ main map ^ 2nd map ^ 3rd map
這相當于:
m := cacheEntries["http://10.3.5.6"]["8080"]
delete(m, "/path")
順便說一句,將索引運算子與多個映射鏈接起來是安全的。如果沒有找到一個鍵,它會生成一個nil地圖,但索引nil地圖不會恐慌:
如果映射
nil包含或不包含這樣的條目,a[x] 是 M 的元素型別的零值
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516132.html
標籤:去数据结构地图嵌套地图
