2017-06-07 1 views
1

Ich lerne gerade Golang, und möchte eine Struktur wie diese bauen.Kann Wert nicht in Karte setzen

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

Folgen ist der Code, den ich schreiben:

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) 
} 

ich Ergebnis ist:

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

Ich weiß nicht, warum der zweiten Ebene Struktur nicht zu Root-Objekt anhängen.

Antwort

1

Das Problem hängt mit der Art der children Karte zusammen. Sie verwenden node Werte in dieser Karte. Daher erhalten Sie bei jedem Zugriff auf einen Schlüssel neue Werte, und die Änderungen werden nicht im ursprünglichen übergeordneten Knoten widergespiegelt.

Der Fehler liegt mit dieser Linie:

child, ok := mm[v] 

child ist eine neue Variable , die auf den Wert des nodemm[v] gleich ist. Die Änderungen, die Sie an diesem Wert vornehmen, bleiben unverändert, während der Wert node in mm unverändert bleibt.

um dieses Problem zu beheben, können Sie *node für Werte in children verwenden:

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

Und den Code entsprechend beheben:

// ... 
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 
// ... 

Arbeitsbeispiel: https://play.golang.org/p/XcmPY4Nx-O