登录
首页 >  Golang >  Go问答

有没有一种标准方法可以分配空间并复制结构体?

来源:stackoverflow

时间:2024-02-21 14:24:24 401浏览 收藏

golang学习网今天将给大家带来《有没有一种标准方法可以分配空间并复制结构体?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

在纯 c 语言中,如果我想要一个结构体的浅堆副本,我会使用 malloc()memcpy()

在 go 中,我想我必须做这样的事情:

original := Data{...}
copy := &Data{}     // malloc
*copy = original    // memcpy

但它对我来说看起来不太好,也不符合习惯。 “正确”的做法是什么?


解决方案


惯用的做法是做一个简单的赋值,让编译器在执行逃逸分析后在堆上分配copy

original := data{...}
copy := original
return ©  // or call some function with © as a parameter

当注意到 copy 通过引用使用并且比堆栈寿命更长时,go 会自动将其分配在堆上而不是堆栈上(当然复制仍然正确完成)

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

您可以在 godbolt 上看到一个正在运行的示例:

给出以下简单代码:

func main() {
   type data struct{
        foo string
    }

    original := data{"hi"}
    copy := original
    copyptr := ©
    fmt.println(copyptr)
}

go 会自动在堆上分配 copy

call    runtime.newobject(sb)

我们还可以通过在编译时传递额外的标志来显示转义和内联决策,从而看到这一点:

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

注意copy 是一个内置函数。避免重复使用名称可能是个好主意(它工作得很好,但这不是一个好习惯)。

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

>

https://play.golang.org/p/4Zcbxhy5UoB

package main

import (
    "fmt"
)

type user struct {
    name string
}

func main() {
    u1 := user{name: "foo"}
    
    u2 := u1
    u2.name = "bar"
    
    fmt.println("u1: ", u1)
    fmt.println("u2: ", u2)

}

输出:

u1:  {foo}
u2:  {bar}

今天关于《有没有一种标准方法可以分配空间并复制结构体?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>