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