1

Go の自動有効化はありますか?

@JimBが正しく気づいたように、私の定義はそれほど厳密ではありません。私の目標について: Python では、自動有効化のための非常にエレガントな「エミュレーション」があります。

class Path(dict):
    def __missing__(self, key):
            value = self[key] = type(self)()
            return value

Goにも同様のソリューションはありますか?

4

2 に答える 2

3

キーが存在しない場合、またはマップがnil

https://play.golang.org/p/sBEiXGfC1c

var sliceMap map[string][]string

// slice is a nil []string
slice := sliceMap["does not exist"]


var stringMap map[string]string

// s is an empty string
s := stringMap["does not exist"]

数値が返されるマップは0欠落しているエントリに対して返されるため、Go では存在しないキーに対してインクリメント演算子とデクリメント演算子を使用できます。

counters := map[string]int{}
counters["one"]++
于 2016-12-30T16:41:16.920 に答える
1

mapまた、interface{}type assertionを組み合わせて JimB の回答を拡張すると、複雑な構造を動的に作成できます。

type Obj map[interface{}]interface{}

func main() {
    var o Obj

    o = Obj{
        "Name": "Bob",
        "Age":  23,
        3:      3.14,
    }
    fmt.Printf("%+v\n", o)

    o["Address"] = Obj{"Country": "USA", "State": "Ohio"}
    fmt.Printf("%+v\n", o)

    o["Address"].(Obj)["City"] = "Columbus"
    fmt.Printf("%+v\n", o)

    fmt.Printf("City = %v\n", o["Address"].(Obj)["City"])
}

出力 ( Go Playgroundで試してください):

map[Name:Bob Age:23 3:3.14]
map[Age:23 3:3.14 Address:map[Country:USA State:Ohio] Name:Bob]
map[3:3.14 Address:map[Country:USA State:Ohio City:Columbus] Name:Bob Age:23]
City = Columbus
于 2016-12-30T20:43:40.040 に答える