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