package main
import "fmt"
import "reflect"
type someMap struct {
X map[string]string
}
func (s *someMap) mapSetter(someKey string, someValue string) {
s.X = make(map[string]string)
s.X[someKey] = someValue
}
func (s someMap) mapGetter() map[string]string {
return s.X
}
func (s someMap) mapKeys() []reflect.Value {
return reflect.ValueOf(s.X).MapKeys()
}
func retrievedList(x map[string]string) {
fmt.Println("I got %v", x)
}
func main() {
v := new(someMap)
v.mapSetter("item1", "value1")
v.mapSetter("item2", "value2")
returnedMap := v.mapGetter()
fmt.Println(returnedMap)
fmt.Println(reflect.TypeOf(returnedMap))
retrievedList(returnedMap)
fmt.Println(v.mapKeys())
keys := v.mapKeys()
fmt.Println(keys[0])
}
正如您所看到的,我将两个键/值设置为我的结构" someMap",但是当它看起来像是覆盖而不是保存时,为什么会这样?
map[item2:value2]
map[string]string
I got %v map[item2:value2]
[item2]
item2
我一直在关注这里的地图示例https://blog.golang.org/go-maps-in-action
据我所知,这不是很多,我是golang的新手,这应该与python类似。
答案 0 :(得分:1)
原因是在mapSetter
中,您每次通过调用s.X
覆盖make(map[string]string)
新实例。从那里删除该行,并在v.X
中初始化main
:
v.X = make(map[string]string)
或创建一个函数来创建新的someMap
实例并初始化其X
:
func New() *someMap {
s := new(someMap)
s.X = make(map[string]string)
return s
}
请参阅here