2017-11-01 11 views
-1
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」という2つのキー/値を設定していますが、キーを保存するのではなく上書きするように見えるのはなぜですか?構造体マップでキー/値が保存されない

map[item2:value2] 
map[string]string 
I got %v map[item2:value2] 
[item2] 
item2 

私はたくさんされていない、として、私の知るここhttps://blog.golang.org/go-maps-in-action

をマップ例を以下してきた、私はgolangする新たなんだ、これは、Pythonと少し似て動作するはずです。

+4

最初の行を参照してください。 'mapSetter'の前のマップを閉じます。 –

答えて

1

mapSetterでは、毎回make(map[string]string)を呼び出して、新しいインスタンスでs.Xを上書きしています。新しいsomeMapインスタンスを作成し、そのXを初期化

v.X = make(map[string]string) 

または両方に関数を作成します:そこからその行を削除し、いずれかのmainv.Xを初期化

func New() *someMap { 
    s := new(someMap) 
    s.X = make(map[string]string) 
    return s 
} 

here

関連する問題