去:我创造了太多的价值观吗?

the*_*tem 12 go

如果我有这样的结构

type myStruct struct {
    mystring string
    myint int
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

    return s
}
Run Code Online (Sandbox Code Playgroud)

因为我在返回它之前首先将它存储在"s"变量中,我的函数实际上是在制作2个myStruct值而不是一个吗?

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

jdi*_*jdi 11

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

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

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

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

    return &s
}
Run Code Online (Sandbox Code Playgroud)

当您比较值的内存地址与指针返回类型时,您可以看到发生的副本: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
Run Code Online (Sandbox Code Playgroud)