Я обнаружил ошибку в своем коде, когда пытался преобразовать map[string]string
в map[string]*string
(преобразование требуется API, который я использовал).
Проблема
В моем первом методе я попытался перебрать каждую запись в исходной карте aMap
и преобразовать строковое значение каждой записи в строковый указатель и присвоить это значение указателя целевой карте, bMap
используя тот же ключ, что и aMap
. Изначально я ожидал, что разыменованное значение, содержащееся в bMap
, будет таким же, как aMap
под тем же ключом. Однако оказалось, что указанное значение bMap
не имеет того же значения, что и aMap
под тем же ключом.
Мои вопросы:
- Почему возникает эта проблема?
- Мне удалось решить проблему, используя второй метод, сначала определив функцию, которая получает строку и возвращает указатель, таким образом, я смог правильно вернуть значение, для которого установлено значение, чтобы использовать то же значение, что и
aMap
, под тем же ключом. Почему этот метод работает? - Также любопытно, почему
&(*v)
синтаксическая ошибка в Go? Я также попытался объявить фиктивную переменную val := *v
и назначить ее bMap
с помощью bMap[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
Большое спасибо.