55394


Golangで構造体を初期化するとき、No.1とNo.2では同じ出力が得られると思うのですが、どう使い分けたらいいのでしょうか？

[code]

    package main
    
    import (
        "fmt"
    )
    
    type Test struct{
        A string
    }
    
    func main() {
        test1 := new(Test) // No.1
        test2 := &Test{}   // No.2
    
        fmt.Println(test1)
        fmt.Println(test2)
    }
    
    
    
[/code]


CC BY-SA 4.0
2019-05-30T02:58:05.090
55361
2019-05-31T05:45:21.920
2019-05-30T03:57:22.237
19297
19297
question
go
Golangの構造体初期化方法


おっしゃる通り両者の挙動は同じです。[Effective
Go](https://golang.org/doc/effective_go.html#composite_literals)
には以下のように書かれています。

> As a limiting case, if a composite literal contains no fields at all, it
> creates a zero value for the type. The expressions `new(File)` and `&File{}`
> are equivalent.

また [spec](https://golang.org/ref/spec) を確認しても（直接は書かれていませんが）両者の挙動は同じです。

したがって、この部分の書き方を制限したければコーディング規約レベルの問題になりそうです。`new()`
を使う方の書き方ではゼロ値以外の値をその場で代入できないことや、composite literal
はポインタではなくて実体を返すとか、そのあたりの好みの問題です。

ただ [Go Code Review
Comments](https://github.com/golang/go/wiki/CodeReviewComments)
にも載ってない程度の問題なので、私だったら規約で縛ることはせず、メモリをアロケートする感覚なのか構造体をゼロ値初期化したものへのポインタを得たい感覚なのかの違いで雑に書き分けてしまうかな、と思います。

※ [Godbolt
でコンパイル結果を確認してみると](https://go.godbolt.org/z/kEyYkG)、アセンブリの引数程度の微妙な違いはあるようですが、最適化の過程の差に見えます。この程度の差を気にしないといけない場面は殆ど無いと判断しました。


CC BY-SA 4.0
2019-05-31T05:12:21.207
55394
2019-05-31T05:45:21.920
2019-05-31T05:45:21.920
19110
19110
55361
answer