Go:我是否创造了太多的值(value)?

标签 go

如果我有这样的结构

type myStruct struct {
    mystring string
    myint int
}

如果我有一个像这样返回新的 myStruct 的函数

func New() myStruct {
    s := myStruct{}

    s.mystring = "string"
    s.myint = 1

    return s
}

因为我在返回之前先将它存储在“s”变量中,所以我的函数实际上是在生成 2 个 myStruct 值而不是一个吗?

如果是这样,那么确保我不先将其存储在变量中是不是更好的做法?

最佳答案

return 语句将返回 myStruct 对象值的副本。如果它是一个小物体,那么这很好。

如果您希望调用者能够修改此对象,并且结构将具有使用指针作为接收者的方法,那么返回指向您的结构的指针更有意义:

func New() *myStruct {
    s := myStruct{}

    s.mystring = "string"
    s.myint = 1

    return &s
}

当您比较值的内存地址与指针返回类型时,您可以看到复制发生:http://play.golang.org/p/sj6mivYSHg

package main

import (
    "fmt"
)

type myStruct struct {
    mystring string
    myint    int
}

func NewObj() myStruct {
    s := myStruct{}
    fmt.Printf("%p\n", &s)

    return s
}

func NewPtr() *myStruct {
    s := &myStruct{}
    fmt.Printf("%p\n",s)
    return s
}

func main() {

    o := NewObj()
    fmt.Printf("%p\n",&o)

    p := NewPtr()
    fmt.Printf("%p\n",p)
}


0xf8400235a0 // obj inside NewObj()
0xf840023580 // obj returned to caller
0xf840023640 // ptr inside of NewPtr()
0xf840023640 // ptr returned to caller

关于Go:我是否创造了太多的值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13963991/

相关文章:

json - 在 Golang 中为复杂的 JSON 数组创建结构

go - Go 如何以及何时为有界队列 channel 分配内存?

go - 向 chan 发送了一个 nil 指针,但收到了 "non-nil"

go - 将嵌入式结构复制到新结构中,而不必复制其所有字段

git - 使用 Docker 在生产中部署 Go 服务

Golang GRPC 返回 EOF 错误

json - 在 Go 中解码通过 MQTT 发布的 JSON 对象

go - 编写一个可以操作多个相似类型的函数

c# - 为什么我们需要指针来为 Go/C 中的变量赋值而不是 C#/Java

go - 如何在Go代码覆盖率计算中包括所有文件?