Ich kann:

_, ok := some_go_map[a_key]

Auf Existenz eines Schlüssels prüfen.

Aber ich wurde durch die setdefault -Methode von Python verwöhnt (wenn für einen Schlüssel kein Wert in einer "Map" [dict == assoziatives Array] festgelegt ist, setzen Sie ihn auf einen bestimmten Standardwert und holen Sie ihn ab, andernfalls nur bekommen).

Sie fragen sich, ob es in Go eine Redewendung gibt, um dasselbe zu erreichen?

10
LetMeSOThat4U 27 Nov. 2013 im 23:29

3 Antworten

Beste Antwort

Sie können es jederzeit selbst definieren:

func setDefault(h map[string]int, k string, v int) (set bool, r int) {
    if r, set = h[k]; !set {
        h[k] = v
        r = v
        set = true
    }
    return
}

Aber nein, es ist nicht in der stdlib. Normalerweise würden Sie dies nur inline tun.

6
Fred Foo 27 Nov. 2013 im 19:50

Soweit ich weiß, ist so etwas nicht eingebaut. Sie können einen Typ hinzufügen, um zu helfen

http://play.golang.org/p/pz34p7w6fP

package main

import "fmt"

type Default struct {
    vals     map[string]int
    defaults int
}

func (d *Default) Get(key string) int {
    if val, ok := d.vals[key]; ok {
        return val
    }
    return d.defaults
}

func main() {
    someMap := Default{map[string]int{"foo": 1, "bar": 2}, 5}
    fmt.Println(someMap.Get("foo"))
    fmt.Println(someMap.Get("doesn't exist"))
}
1
Buddy 27 Nov. 2013 im 20:00

Beachten Sie, dass Go standardmäßig den "Nullwert" für den Werttyp zurückgibt (z. B. { {X0}} oder ""), wenn ein nachgeschlagener Schlüssel fehlt. Wenn also der gewünschte Standardwert dieser ist, sind Sie bereits festgelegt.

In Anlehnung an die Antworten von Buddy und Larsmans finden Sie hier einen Code, der eine neue Methode an einen benannten Dict -Typ anfügt, sodass Sie entweder d[key] für das integrierte Verhalten von Go oder d.SetDefault(key, val) verwenden können.

http://play.golang.org/p/5SIJSWNWO7

package main

import "fmt"

type Dict map[string]float64

func (d Dict) SetDefault(key string, val float64) (result float64) {
    if v, ok := d[key]; ok {
        return v
    } else {
        d[key] = val
        return val
    }
}

func main() {
    dd := Dict{}
    dd["a"] = 3
    fmt.Println(dd.SetDefault("a", 1))
    fmt.Println(dd.SetDefault("b", 2))
}
8
twotwotwo 12 Dez. 2013 im 02:16