質問やフィードバックがありましたら、フォームからお願いします
本文は台湾華語で、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
を使ってしまうこともあります。この二つの違いを理解することが非常に重要です。
もっと読む
この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨
☕Buy me a coffee