go语言中如何将带有map的struct存储到数组中

Posted

技术标签:

【中文标题】go语言中如何将带有map的struct存储到数组中【英文标题】:How to store struct with map into an Array in the go language 【发布时间】:2021-09-30 05:54:54 【问题描述】:

我做了一个这样的包...

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


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

我正在处理这样的文件行

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

但是当我最后去检查arrayFoo时,我有一些看起来像这样的东西 [num:1, aMap:/*final state*/, num:2, aMap:/*final state*/, ...]

所以整数正在更新,但我需要存储aMap 的副本,而不仅仅是指向aMap 的指针。


更新:

这是playground。

更新2:

这是version that works。我的类比这要复杂得多,所以我想我会在package foo 中编写一个辅助函数来克隆它。

【问题讨论】:

以下是否回答了您的问题? ***.com/questions/23057785/how-to-copy-a-map 顺便说一句,如果您只有一个键,您可以执行以下操作,而不是 foo.aMap[key] += ifoo.aMap = map[string]int"key": foo.aMap[key] + i。 play.golang.org/p/ICM8kRnM2Ey @mkopriva 不幸的是,密钥是动态的,每次阅读我都可能获得或失去一个。不过谢谢! 有没有更简单的方法来复制地图或大多数人都这样做?似乎有一个实用程序就足够普遍了 据我所知,在标准库或适当的语言中没有任何用于复制地图的实用程序。除了 3 行循环之外,就是这样。 【参考方案1】:

有没有更简单的方法来复制地图或大多数人都这样做?

任何需要深拷贝的东西,如“Is there a built in function in go for making copies of arbitrary maps?”中提到的,都会涉及到一个专用函数。

this gist 中的示例:

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

【讨论】:

【参考方案2】:

根据 mkopriva 的建议,将 foo.aMap[key] += i 行替换为 foo.aMap = map[string]int"key": foo.aMap[key] + i

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)

输出:

-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]]

【讨论】:

以上是关于go语言中如何将带有map的struct存储到数组中的主要内容,如果未能解决你的问题,请参考以下文章

go语言版本的 array_column 方法

Go语言入门到放弃-变量

Go语言中new()和make()的区别

Go 空结构体 struct 的使用

Go语言处理JSon字段

Go语言结构体(struct)