Go 是否有一种惯用的方法通过结构实现malloc和memcpy?

Go 是否有一种惯用的方法通过结构实现malloc和memcpy?,go,malloc,Go,Malloc,在普通C中,如果我想要一个结构的浅堆副本,我会使用malloc和memcpy 在围棋中,我想我必须这样做: 原始:=数据{…} 复制:=&数据{}//malloc *复制=原件//memcpy 但在我看来,它既不好看,也不地道。正确的方法是什么?惯用的方法是执行一个简单的赋值,让编译器在执行转义分析后在堆上分配副本: original := Data{...} copy := original return &copy // Or call some function with &am

在普通C中,如果我想要一个结构的浅堆副本,我会使用malloc和memcpy

在围棋中,我想我必须这样做:

原始:=数据{…} 复制:=&数据{}//malloc *复制=原件//memcpy
但在我看来,它既不好看,也不地道。正确的方法是什么?

惯用的方法是执行一个简单的赋值,让编译器在执行转义分析后在堆上分配副本:

original := Data{...}
copy := original
return &copy  // Or call some function with &copy as a parameter
当注意到复制被引用使用并且超出堆栈时,Go将自动在堆上而不是堆栈上分配它。当然,复制仍然正确完成

我们实际上不再关心堆,而是让编译器根据转义分析根据需要在那里分配堆。我们唯一关心的是副本本身

您可以在以下方面看到一个示例:

给出以下简单代码:

func main{ 类型数据结构{ foo字符串 } 原始:=数据{hi} 副本:=原件 copyPtr:=&复制 fmt.printlncopptr } Go将自动在堆上分配副本:

        call    runtime.newobject(SB)
我们还可以通过在编译时传递额外的标志(显示转义和内联决策)看到这一点:

$ go build -gcflags '-m' .
...
./main.go:11:2: moved to heap: copy
...

注意:是一个内置函数。避免重用名称可能是一个好主意,但这不是一个很好的做法。

惯用的方法是执行一个简单的赋值,让编译器在执行转义分析后在堆上分配副本:

original := Data{...}
copy := original
return &copy  // Or call some function with &copy as a parameter
当注意到复制被引用使用并且超出堆栈时,Go将自动在堆上而不是堆栈上分配它。当然,复制仍然正确完成

我们实际上不再关心堆,而是让编译器根据转义分析根据需要在那里分配堆。我们唯一关心的是副本本身

您可以在以下方面看到一个示例:

给出以下简单代码:

func main{ 类型数据结构{ foo字符串 } 原始:=数据{hi} 副本:=原件 copyPtr:=&复制 fmt.printlncopptr } Go将自动在堆上分配副本:

        call    runtime.newobject(SB)
我们还可以通过在编译时传递额外的标志(显示转义和内联决策)看到这一点:

$ go build -gcflags '-m' .
...
./main.go:11:2: moved to heap: copy
...

注意:是一个内置函数。避免重复使用名称可能是一个好主意,但这不是一个很好的做法。

Golang中的结构变量可以通过赋值语句复制到另一个:

输出:

u1:  {foo}
u2:  {bar}

Golang中的结构变量可以通过赋值语句复制到另一个:

输出:

u1:  {foo}
u2:  {bar}