如果我有这样的结构
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/