当我尝试转换为时,我发现我的代码存在错误(我map[string]string正在map[string]*string使用的 API 需要转换)。
在我的第一个方法中,我尝试遍历源映射中的每个条目,aMap并将每个条目的字符串值转换为字符串指针,并将此指针值分配给目标映射,bMap与aMap. 我最初预计保留的取消引用值bMap与aMap同一键下的值相同。但是,事实证明,在同一键下, 的延迟值bMap不共享相同的值。aMap
我的问题是:
为什么会出现这个问题?
我能够使用第二种方法解决该问题,首先定义一个接收字符串并返回指针的函数,这样我就能够正确返回延迟值以共享与aMap同一键下相同的值。为什么这种方法有效?
另外,只是好奇,为什么&(*v)Go 中有语法错误?我还尝试声明一个虚拟变量val := *v,并将其分配给bMapusingbMap[key] = &val但无济于事。错误说invalid indirect of v (type string)
https://play.golang.org/p/ZG7XS2vJx0y
func main() {
aMap := make(map[string]string)
aMap["foo"] = "bar"
aMap["bar"] = "baz"
aMap["baz"] = "foo"
bMap := make(map[string]*string)
for k, v := range(aMap){
bMap[k] = &v
}
// first method
fmt.Println("1st method, map[string]*string, bMap")
for k, v := range(bMap){
fmt.Printf("bMap[%s] = %s / %s, aMap[%s] = %s\n",
k, *bMap[k], *v, k, aMap[k])
}
pString := func(v string) *string{ return &v }
for k, v := range(aMap){
bMap[k] = pString(v)
}
// second method
fmt.Println("2nd method, map[string]*string, bMap")
for k, v := range(bMap){
fmt.Printf("bMap[%s] = %s / %s, aMap[%s] = %s\n",
k, *bMap[k], *v, k, aMap[k])
}
// expected results
fmt.Println("Expected result: map[string]string, cMap")
cMap := make(map[string]string)
for k, v := range(aMap){
cMap[k] = v
}
for k, v := range(cMap){
fmt.Printf("cMap[%s] = %s / %s, aMap[%s] = %s\n",
k, cMap[k], v, k, aMap[k])
}
}
输出
1st method, map[string]*string, bMap
bMap[baz] = foo / foo, aMap[baz] = foo
bMap[foo] = foo / foo, aMap[foo] = bar
bMap[bar] = foo / foo, aMap[bar] = baz
2nd method, map[string]*string, bMap
bMap[baz] = foo / foo, aMap[baz] = foo
bMap[foo] = bar / bar, aMap[foo] = bar
bMap[bar] = baz / baz, aMap[bar] = baz
Expected result: map[string]string, cMap
cMap[baz] = foo / foo, aMap[baz] = foo
cMap[foo] = bar / bar, aMap[foo] = bar
cMap[bar] = baz / baz, aMap[bar] = baz
太感谢了。
蓝山帝景
牧羊人nacy
哔哔one
随时随地看视频慕课网APP
相关分类