2016-12-30 2 views
1

Y a-t-il autovivification pour Go? Comme @JimB l'a remarqué correctement, ma définition n'est pas si stricte. A propos de mon objectif: En Python, nous avons une très élégante "émulation" pour un autovivification:Y a-t-il autovivification pour Go?

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

Y at-il une solution similaire pour Go?

+0

Go est statiquement typé et compilé. Vous ne pouvez pas vraiment avoir une "référence indéfinie", et s'il y a une référence nulle qui ne devrait pas l'être, c'est une erreur dans votre programme. – JimB

+0

Cela vaut aussi pour C++, et là c'est possible. Ai-je tort? –

+1

Je suppose que cela dépend de votre définition. Je n'appellerais pas ce que C++ peut faire "autovivification" comme il est défini, il est juste listé dans la comparaison ou l'émulation du comportement. Go peut également renvoyer une valeur nulle à partir d'une carte si la clé n'existe pas, mais les valeurs doivent encore être définies. – JimB

Répondre

3

Cartes renvoie une valeur zéro pour le type si la clé n'existe pas, ou la carte est 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"] 

Depuis une carte avec des valeurs numériques retour retournera 0 pour entrées manquantes, Go vous permet d'utiliser les opérateurs d'incrémentation et de décrémentation sur les clés inexistantes:

counters := map[string]int{} 
counters["one"]++ 
1

étendre la réponse de JimB, avec la combinaison de map, interface{} et type assertion, vous pouvez créer dynamiquement des structures complexes:

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

sortie (essayez le 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