我想复制数据结构的实例。由于 go 没有任何内置函数,因此我使用第三方库:https://github.com/emirpasic/gods。
例如,我可能会尝试使用带有哈希集的深复制。
var c, d hashset.Set
c = *hashset.New()
c.Add(1)
deepcopy.Copy(d, c)
c.Add(2)
fmt.Println(c.Contains(2))
fmt.Println(d.Contains(2))
fmt.Println(c.Contains(1))
fmt.Println(d.Contains(1))
Run Code Online (Sandbox Code Playgroud)
然而,哈希集的内容根本没有被复制。我知道深层复制模块无法复制未导出的值,但是由于库中没有内置的“复制构造函数”,这是否意味着无法在不修改其代码的情况下使用库完全复制数据结构实例?(我研究过的其他一些库也出现类似的问题)。
我是 golang 新手,感觉不对,因为类似的事情可以很容易地实现,例如在 C++ 中。我知道我可以编写自己的版本或修改他们的代码,但这比预期的工作量太多,这就是为什么我认为应该有一种惯用的方法。
PS:对于那些可能会说“不需要这样的功能”的人,我将一些具有某些数据结构的复杂状态分配给并行计算线程,他们直接使用状态并且不能互相干扰。
我正在GO中编写一个应用程序,它使用encoding/gob在节点之间通过UDP发送结构和切片.它工作正常,但我注意到encoding/json也有类似的API.搜索并找到此信息(https://golang.org/pkg/encoding/):
gob Package gob管理gobs流 - 在编码器(发送器)和解码器(接收器)之间交换的二进制值.
json包json实现了RFC 4627中定义的JSON编码和解码.
有人可以向我解释一个人是否比另一个人更有效率,并且一般比较何时选择什么?另外如果我需要与非golang应用程序接口,我想json会更受欢迎?
我的任务是将C++代码替换为Go,而我是Go API的新手.我使用gob将数百个键/值条目编码到磁盘页面,但gob编码有太多膨胀,不需要.
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type Entry struct {
Key string
Val string
}
func main() {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
e := Entry { "k1", "v1" }
enc.Encode(e)
fmt.Println(buf.Bytes())
}
Run Code Online (Sandbox Code Playgroud)
这会产生很多我不需要的臃肿:
[35 255 129 3 1 1 5 69 110 116 114 121 1 255 130 0 1 2 1 3 75 101 121 1 12 0 1 3 86 97 108 1 12 0 0 0 11 255 130 1 2 …Run Code Online (Sandbox Code Playgroud) 我几乎可以肯定这一点,但我想 100% 确定。因为这在 JS/PHP 之后看起来很奇怪。
type Vertex struct {
X, Y float64
}
func (v Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
Run Code Online (Sandbox Code Playgroud)
那么是不是每个参数都会进行深度复制(强调这一点)?v VertexScale?因此,我们应该使用指针接收器而不是值接收器以避免深度复制?
这同样适用于参数,对吗?复制发生的其他地方还有哪些?
我想找到哪个更快:struct vs array.所以我编写了一个GO代码,在其中我将4个int值(1,2,3和4)写入结构的成员,然后写入长度为4的数组.我试图找到写入所需的时间.
案例1:首先,我将值写入结构,然后写入数组.在这里,我发现数组比结构更快.
package main
import (
"fmt"
"time"
)
type abc struct {
a, b, c, d int
}
func main() {
var obj abc
t1 := time.Now()
obj.a = 1
obj.b = 2
obj.c = 3
obj.d = 4
t2 := time.Since(t1)
fmt.Println("Struct access time: : ", t2)
a := make([]int, 4)
t3 := time.Now()
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
t4 := time.Since(t3)
fmt.Println("Array access time: : ", t4)
} …Run Code Online (Sandbox Code Playgroud) go ×5
struct ×3
gob ×2
benchmarking ×1
deep-copy ×1
encoding ×1
json ×1
performance ×1
slice ×1