2017-06-07 13 views
1

私はgolangを学び、このような構造体を作りたいと考えています。マップに値を入れることができません

package main 

import "fmt" 
type node struct { 
    end  bool 
    char  string 
    children map[int32]node 
} 

func addKeyword(root *node, key string) { 
    current := root 
    for _, v := range key { 
     mm := current.children 
     if nil == mm || len(mm) == 0 { 
      mm = make(map[int32]node) 
      current.children = mm 
     } 
     child, ok := mm[v] 
     if !ok { 
      child = node{false, string(v), nil} 
      mm[v] = child 
     } 
     current = &child 
    } 
    current.end = true 
} 

func main() { 
    root := new(node) 
    addKeyword(root, "he") 
    addKeyword(root, "she") 
    fmt.Println(root) 
} 

私は結果が取得:セカンドレベルの構造体は、ルートオブジェクトに追加していない理由を私は知らない

{end:false map["h":{false "h" map[]} 
      "s":{false "s" map[]} 
]} 

{end:false map["h":{false "h" map["e":{true "e" map[]}]} 
      "s":{false "s" map["h":{false "h" map["e":{true "e" map[]}]}]} 
]} 

フォロー

は私が書くコードです。

答えて

1

問題はchildrenマップのタイプに関連しています。このマップではnodeの値を使用しています。その結果、キーにアクセスするたびに新しい値が取得され、変更は元の「親」ノードに反映されません。

障害がこのラインである:

child, ok := mm[v] 

childnodemm[v]の値に等しい新しい変数です。この値に変更が加えられ、nodeの値はmmのままです。

type node struct { 
    end  bool 
    char  string 
    children map[int32]*node 
} 

をし、それに応じてコードを修正:

この問題を修正するには、childrenの値のため*nodeを使用することができます

// ... 
mm := current.children 
if nil == mm { 
    mm = make(map[int32]*node) 
    current.children = mm 
} 
child, ok := mm[v] 
if !ok { 
    child = &node{false, string(v), nil} 
    mm[v] = child 
} 
current = child 
// ... 

の作業例:https://play.golang.org/p/XcmPY4Nx-O

関連する問題