Python から Go にアルゴリズムを移植しようとしています。その中心部分は辞書を使用して構築されたツリーであり、各ノードは任意の数の子を持つことができるため、このままにしておく必要があります。すべてのリーフは同じレベルにあるため、最下位レベルのディクテーションには他のディクテーションが含まれ、最下位レベルのディクテーションにはフロートが含まれます。このような:
tree = {}
insert(tree, ['a', 'b'], 1.0)
print tree['a']['b']
そのため、言語を学習しながらコードを Go に移植しようとしているときに、基本的なアイデアをテストするために次のことを始めました。
func main() {
tree := make(map[string]interface{})
tree["a"] = make(map[string]float32)
tree["a"].(map[string]float32)["b"] = 1.0
fmt.Println(tree["a"].(map[string]float32)["b"])
}
これは期待どおりに機能するので、次のステップはこれを「ツリー」、パス、および値を取るルーチンに変えることでした。私は再帰的なアプローチを選択し、これを思いつきました:
func insert(tree map[string]interface{}, path []string, value float32) {
node := path[0]
l := len(path)
switch {
case l > 1:
if _, ok := tree[node]; !ok {
if l > 2 {
tree[node] = make(map[string]interface{})
} else {
tree[node] = make(map[string]float32)
}
}
insert(tree[node], path[1:], value) //recursion
case l == 1:
leaf := tree
leaf[node] = value
}
}
これは、ルーチンが構造化されるべきだと私が想像する方法ですが、「再帰」でマークされた行を機能させることができません。で型アサーションを実行しようとすると、コンパイラ エラーまたは実行時エラーが発生しますtree[node]
。これを行う正しい方法は何ですか?