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])
}
As you can see, I'm setting two keys/values to my struct "someMap", however when it looks like the key is overwritten rather than saved, why is this?
map[item2:value2]
map[string]string
I got %v map[item2:value2]
[item2]
item2
I've been following the map examples here https://blog.golang.org/go-maps-in-action
As far I know, which isn't a lot, I'm new to golang, this should work somewhat similar to python.
The reason is that in mapSetter
you are overwriting s.X
every time with a new instance by calling make(map[string]string)
. Remove that line from there and either initialize v.X
in main
:
v.X = make(map[string]string)
Or create a function to both create the new someMap
instance and initialize its X
:
func New() *someMap {
s := new(someMap)
s.X = make(map[string]string)
return s
}
See here