结构图不保存键/值

时间:2017-11-01 02:49:13

标签: go

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类似。

1 个答案:

答案 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