gpt4 book ai didi

pointers - Go:在不复制的情况下将数组的指针传递给 gob?

转载 作者:IT王子 更新时间:2023-10-29 01:43:09 28 4
gpt4 key购买 nike

我有一个非常非常大的 map 阵列(不是 slice ),然后我试图对其进行编码。我真的需要避免复制数组,但我不知道该怎么做。

到目前为止,我有这个:

func doSomething() {
var mygiantvar [5]map[string]Searcher
mygiantvar = Load()
Save(`file.gob.gz`, &mygiantvar)
}

func Save(filename string, variable *[5]map[string]Searcher) error {
// Open file for writing
fi, err := os.Create(filename)
if err !=nil {
return err
}
defer fi.Close()
// Attach gzip writer
fz := gzip.NewWriter(fi)
defer fz.Close()
// Push from the gob encoder
encoder := gob.NewEncoder(fz)
err = encoder.Encode(*variable)
if err !=nil {
return err
}
return nil
}

根据我的理解,会将 mygiantvar 的指针传递给 Save,从而保存第一个副本。但是整个数组肯定会被复制到 encoder.Encode 中,然后它将复制到更多函数中,对吧?

mygiantvar 变量的大小约为 10GB。所以它必须避免被复制。

但话又说回来,也许只有实际的数组 [5] 部分被复制,但是其中的映射是数组中的指针,因此将复制指向映射的指针数组而不是映射本身?我对此一无所知 - 这一切都非常令人困惑。

有什么想法吗?

最佳答案

请注意 Encoder.Encode将传递一个接口(interface){}

func (enc *Encoder) Encode(v interface{}) error {

就像我在“what is the meaning of interface{} in golang?”中描述的那样,这意味着一种指向您将传递给它的任何内容的指针
(另见“Why can't I assign a *Struct to an *Interface?”)

An interface value isn't the value of the concrete struct (as it has a variable size, this wouldn't be possible), but it's a kind of pointer (to be more precise a pointer to the struct and a pointer to the type)

http://i.stack.imgur.com/H78Bz.png

这意味着它不会复制您的 map (或此处的 your array)的全部内容。
由于数组是一个值,您可以将其 slice 以避免在调用 Encode() 期间发生任何复制:

err = encoder.Encode(*variable[:])

参见“Go Slices: usage and internals

This is also the syntax to create a slice given an array:

x := [3]string{"Лайка", "Белка", "Стрелка"}
s := x[:] // a slice referencing the storage of x

如果这不起作用,您可以保留*variable(这里是一个数组:[5]map[string]Searcher),作为 map 类型是引用类型,如指针或 slice :副本不会很大。
参见“Go maps in action”。

虽然数组在传递给接口(interface){}时会被复制,但 map 内容不会被复制。
请参阅此 play.golang.org 例子:

package main

import "fmt"

func main() {
var a [1]map[string]int
a[0] = make(map[string]int)
a[0]["test"] = 0
modify(a)
fmt.Println(a)
}

func modify(arr interface{}) {
a := arr.([1]map[string]int)
a[0]["test"] = -1
}

输出:

[map[test:-1]]

关于pointers - Go:在不复制的情况下将数组的指针传递给 gob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25102030/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com