logo
  • 現在做什麼
  • 關於我

Kalan

文章分類

  • 前端
  • 開發筆記
  • 雜談
  • 年度回顧

快速連結

  • 現在做什麼
  • 關於我
  • 聯絡我
  • 職涯思考🔗

關注我

在福岡生活的開發者,分享軟體開發與日本生活的點點滴滴。

© 2025 Kalan Made with ❤️. All rights reserved.

新品と新品の違い

作成者:カランカラン2018年8月16日 3:00
ホーム/開発ノート
💡

質問やフィードバックがありましたら、フォームからお願いします

英語原文

目次

  1. new
  2. make
  3. 結論
    1. もっと読む

本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください

golang には make と new という二つの予約語があり、特にゴランを初めて学ぶときに混同しやすい部分です。ここでは簡単なメモを作成しました。

new

new はジェネリックを初期化するために使用でき、メモリのアドレスを返します。通常、私たちは new を使った後にポインタ変数を使って型を受け取ります。特に注意が必要なのは、new は自動的に型をゼロ初期化することです。つまり、文字列は ""、数値は 0、チャネル、関数、マップ、スライスなどは nil になります。

この特性から、もしマップに対して以下の操作を行うと、panic: assignment to entry in nil map というエラーが発生します。

func main() {
	people := new(map[string]string)
	p := *people
	p["name"] = "Kalan" // panic: assignment to entry in nil map
}

初期化されたマップは nil マップになるため、他のプリミティブ型のようにデフォルト値が存在しません。

もし struct を使って初期化する場合、& を使ってポインタのアドレスを直接示すこともできます。以下の二つの書き方は同じ効果があります。

type Person struct {
  Name string
  Age  int
}

func main() {
    p := &Person{}
    p := new(Person)
}

上記の Person は、渡したい値に応じて追加の設定が可能ですが、new は全てのフィールドをゼロ初期化します。

make

make は new とは異なり、チャネル、マップ、スライスなどの特別な型を初期化するために使用されます。また、make はポインタを返さないことに特に注意が必要です。ポインタを取得する必要がある場合は、new のような方法で型を初期化することを考慮しなければなりません。

func main() {
    receiver := make(chan string) // チャネルを初期化しますが、ポインタは返しません
    person := make(map[string]string)
    people := make([]string, 100) // 長さ100の文字列配列を初期化
}

再度強調しますが、**make はポインタを返しません!**以下のコードはエラーを引き起こします。

func main() {
	person := make(map[string]string)
	fmt.Println(*person) // invalid indirect of person
}

結論

make と new はゴランを学び始める際に混同しやすく、時には引数をポインタで渡さなければならないときにうっかり make を使ってしまうこともあります。この二つの違いを理解することが非常に重要です。

もっと読む

  • https://golang.org/doc/effective_go.html#allocation_make
  • https://golang.org/doc/effective_go.html#allocation_new
← バースデーパラドックスvuex と webpack の動的インポートによりモジュールを動的にロードする →

この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨

☕Buy me a coffee

目次

  1. new
  2. make
  3. 結論
    1. もっと読む