Isso é mega específico, mas preciso salvar um dicionário em um slice. A ideia é que eu possa preencher um dict (que chamo de "lookup") com valores, então salvar esses valores dentro de um slice (que chamo simplesmente de "data"), para que eu possa preencher esse mesmo dict com outros valores e salvá-los novamente. Dessa forma, posso acessar esses dicionários chamando data[0] ou data[1]
O problema é simplesmente que não tenho a mínima ideia de como fazer isso. Tentei data = append(data, lookup)
depois de inicializar data como data := make([]map[string]string, 0
, mas o problema é que os valores já dentro de data mudaram junto com lookup (o que significa que ele foi preenchido com, tipo, 100 cópias do mesmo dict). Também tentei fazer um tipo type data map[string]interface{}
- já que outra pergunta semelhante que foi feita aqui tinha essa solução - e então data := []data{}
into data = append(data, lookup)
mas recebi um erro de tipo incompatível. Eu provavelmente deveria mencionar que lookup foi inicializado como lookup := make(map\[string\]string)
. Aqui está uma versão mais resumida:
lookup := make(map[string]string)
//this is where I'd initialize data, had I known what type I wanted. For now, I have this:
data := make([]map[string]string, 0)
//there are also a few more variables initialized here but, I don't think they're really needed for the problem at hand
//the function keeps running, filling up lookup with keys and values. Then, I've reached a point where those values need to be saved, I try:
data = append(data, lookup)
//and then reset the values of all other variables, and get lookup ready to start again
//when I print data, however, all the dicts inside it are the same, which is equal to the last value lookup had before reaching the end. I don't get why that happens - it's not like I'm saving a pointer to lookup - and if someone knows I would give you my life.
Agradeço desde já. Procurei uma resposta em todos os lugares, mas não obtive nada.
A declaração a seguir não "salva" o
lookup
mapa nodata
slice no sentido de que faria um backup/cópia:Em Go, "tipos de mapa são tipos de referência, como ponteiros ou fatias" (de acordo com esta postagem do blog ). Então,
lookup
refere-se a uma estrutura interna do mapa armazenada em algum lugar na memória. Quando você anexalookup
adata
, você está copiando a referência para a fatia, não todos os dados do mapa. Depois, amboslookup
edata[0]
referem-se ao mesmo mapa.O que você pode fazer é clonar o mapa (como @legec sugeriu nos comentários):
ou, supondo que você esteja fazendo um loop em algum lugar, apenas crie um novo
lookup
mapa para cada iteração no corpo do loop: