WebHU - Programozási kérdések és válaszok

Hogyan tárolhatunk struktúrát térképpel egy tömbben a go nyelven

Csináltam egy ilyen csomagot...

package foo
type Foo struct {
    num   int
    aMap  map[int](int)
}

func MakeFoo() BookState {
    return Foo{
        num:  -1,
        aMap: make(map[int](int)),
    }
}

Egy ilyen fájl sorait dolgozom fel

nrows :=100
arrayFoo = make([]Foo, nrows)
Foo = foo.MakeFoo()
count := 0
for int i=0; i < nrows; i++ {
   row = myWrappedReader.ReadLine()
   foo.num = i
   foo.aMap[key] += row.otherNum
   arrayFoo[i] = foo
}

De aztán amikor megnézem a arrayFoo végén, van valami, ami így néz ki [{num:1, aMap:{/*final state*/}, {num:2, aMap:{/*final state*/}, ...]

Tehát az egész szám frissül, de a aMap-ra mutató mutató helyett a aMap másolatára van szükségem.


Update:

Íme egy játszótér.

Update2:

Íme egy működő verzió. Az én osztályom ennél kicsit bonyolultabb, ezért azt hiszem, írok egy segítő függvényt a package foo-be, ami klónozná.


  • A következő választ ad a kérdésedre? stackoverflow.com/questions/23057785/how-to-copy-a-map 23.07.2021
  • Egyébként, ha csak egyetlen kulcsa van, akkor a foo.aMap[key] += i helyett a következőket teheti: foo.aMap = map[string]int{"key": foo.aMap[key] + i}. play.golang.org/p/ICM8kRnM2Ey 23.07.2021
  • @mkopriva sajnos a billentyűk dinamikusak, és minden olvasásnál nyerhetek vagy veszíthetek egyet. azért köszönöm! 23.07.2021
  • Van egyszerűbb módja a térképek másolásának, vagy a legtöbben ezt csinálják? Úgy tűnik, ez elég gyakori lenne ahhoz, hogy legyen hozzá segédprogram 23.07.2021
  • Amennyire én tudom, nincs semmilyen segédprogram a térképek másolására a szabványos könyvtárban vagy a megfelelő nyelven. Egy 3 soros hurkon kívül, az. 23.07.2021
  • fontolja meg a go fm parancs használatát a forráskód formázásához. próbálja ki a play.golang.org oldalon 23.07.2021

Válaszok:


1

Van egyszerűbb módja a térképek másolásának, vagy a legtöbben ezt csinálják?

Bármi, ami mélymásolást igényel, amint azt a Van-e beépített funkció a go-ban tetszőleges térképek másolására?, dedikált funkciót foglalnak magukban.

Példa ebben a lényegben:

package deepcopy

import (
    "bytes"
    "encoding/gob"
)

func init() {
    gob.Register(map[string]interface{}{})
}

// Map performs a deep copy of the given map m.
func Map(m map[string]interface{}) (map[string]interface{}, error) {
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    dec := gob.NewDecoder(&buf)
    err := enc.Encode(m)
    if err != nil {
        return nil, err
    }
    var copy map[string]interface{}
    err = dec.Decode(&copy)
    if err != nil {
        return nil, err
    }
    return copy, nil
}
23.07.2021

2

Az mkopriva javaslata alapján a foo.aMap[key] += i sort foo.aMap = map[string]int{"key": foo.aMap[key] + i}-re cseréli

package main

import (
    "fmt"
)

type Foo struct {
    num  int
    aMap map[string](int)
}

func MakeFoo() Foo {
    return Foo{
        num:  -1,
        aMap: make(map[string](int)),
    }
}

func main() {
    foo := MakeFoo()

    key := "tmp"
    foo.aMap[key] = 0

    fmt.Println(foo)
    arrayFoo := make([]Foo, 10)
    for i := 0; i < 10; i++ {
        foo.num = i
        foo.aMap = map[string]int{"key": foo.aMap[key] + i}
        arrayFoo[i] = foo
    }
    fmt.Println(arrayFoo)
}

Kimenet:

{-1 map[tmp:0]}
[{0 map[key:0]} {1 map[key:1]} {2 map[key:2]} {3 map[key:3]} {4 map[key:4]} {5 map[key:5]} {6 map[key:6]} {7 map[key:7]} {8 map[key:8]} {9 map[key:9]}]
23.07.2021
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..