web-dev-qa-db-fra.com

Créer des variables de carte globales

J'ai besoin d'un peu d'aide concernant la création d'une variable de carte globale dans Go. Ce que j'ai fait est le suivant:

package ...
import(
...
)
...
type ir_table struct{
    symbol      string
    value       string
}
var ir_MAP map[int]ir_table

Comme je n'initialise pas la carte, j'obtiens une erreur de déréférencement de pointeur nul. Que dois-je faire pour utiliser cette variable globalement? Ou, si ce n'est pas une bonne façon de procéder, veuillez me guider.

24
progfan

Vous devez l'initialiser avec une carte vide:

var ir_MAP = map[int]ir_table{}

ou, comme "le système" l'a suggéré:

var ir_MAP = make(map[int]ir_table)

Le problème est que la valeur zéro d'une carte est nulle et que vous ne pouvez pas ajouter d'éléments à une carte nulle.

35
andybalholm

Vous avez presque raison. Vous n'avez tout simplement pas encore initialisé votre carte.

Voici le code de travail dans The Playground .

package main

import "fmt"

type ir_table struct{
    symbol      string
    value       string
}
// define global map; initialize as empty with the trailing {}
var ir_MAP = map[int]ir_table{}

func main() {
    ir_MAP[1] = ir_table{symbol:"x", value:"y"}
    TestGlobal()
}

func TestGlobal() {
    fmt.Printf("1 -> %v\n", ir_MAP[1])
}
8
Daniel

ancien sujet, mais la solution la plus élégante n'a pas été mentionnée. Ceci est très utile dans les modules où il n'est pas possible d'assigner des valeurs dans la fonction principale. init n'est exécuté qu'une seule fois, ce qui permet d'économiser quelques cycles de processeur à chaque fois que la carte devrait être initialisée autrement.

https://play.golang.org/p/XgC-SrV3Wig

package main

import (
    "fmt"
)

var (
    globalMap = make(map[string]string)
)

func init() {
    globalMap["foo"] = "bar"
    globalMap["good"] = "stuff"
}

func main() {
    fmt.Printf("globalMap:%#+v", globalMap)
}
0
Victor Smirnov