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] += i
:foo.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(©)
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存储到数组中的主要内容,如果未能解决你的问题,请参考以下文章