Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Goでよく見るnewとNewを調べたときのメモ

More than 1 year has passed since last update.

はじめに

Goのソースコードを読んでいて、構造体関連で newNew をよく見かけていたのですが、それぞれの意味や違いをあまり理解していなかったので、それらを調べたときのメモです。

new

newは指定した型のポインタ型を生成する関数です。
例えば、構造体型のポインタ型を生成できます。

newを使った初期化
type person struct {
    height float32
    weight float32
}

func main() {
    p := new(person)
    p.height = 182.0
    p.weight = 75.5
    fmt.Println(p) // &{182 75.5}
    fmt.Printf("%T", p) // *main.person person型のポインタであることがわかる
    fmt.Println()
    fmt.Printf("%p", p) // 0xc00001e060 もちろんアドレスもある
}

構造体型のポインタ型を生成する手段としては、他にアドレス演算子を使う方法もあります。どちらも動作上殆ど同じです。

アドレス演算子を使った初期化
func main() {
    p := &person{height: 182.0, weight: 75.5}
    fmt.Println(p) // &{182 75.5}
}

構造体の初期化する際は、構造体を値型のまま使用するケースはほとんどないため、 newを使う方法アドレス演算子を使う方法 のいずれかでポインタ型にするのが基本です。

また、newは構造体以外の値型にも参照型の変数にも使用できます。
しかしながら、このような使用は普段のソフトウェア開発では滅多にありません。現実的には構造体とnewはセットで使うことが多いです。

func main() {
    a := new(int)
    fmt.Println(a) // 0xc00001e060
}

New

Goにはコンストラクタが用意されていません。
しかし、コンストラクタのようなものは実装できます。その時の関数名として通例、 New + 構造体名 が適用されます。

type person struct {
    height float32
    weight float32
}

func NewPerson(height, weight float32) *person{
    return &person{height: height, weight: weight}
}

func main() {
    p := NewPerson(182.0, 75.5)
    fmt.Println(p) // &{182 75.5}
}

まとめ

  • newは構造体の初期化でよく使う
  • Newはコンストラクタの単なる命名における慣例
gold-kou
NTT米屋➡︎ZOZOテクノロジーズ スクラムマスター兼バックエンドエンジニアです。 GoとかgRPCとかOpenAPIとか。 外部記憶として学んだことを記事として残しています。 私の記事は個人的なものであり、会社を代表するものではございません。
zozotech
70億人のファッションを技術の力で変えていく
https://tech.zozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away