カランのブログ

ソフトウェアエンジニア / 台湾人 / 福岡生活

今のモード ライト

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を使用して初期化する場合、アドレスを示すために&を直接使用することもできます。以下の2つの方法は同じ効果があります。

type Person struct {
  Name string
  Age  int
}

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

利点は、上記のPersonに自分自身の値を追加することができることですが、newはすべてのフィールドにゼロ値を直接設定します。

make

makenewとは異なり、チャネル、マップ、スライスなどの特殊な型を初期化するために使用されます。また、特筆すべきは、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
}

結論

newmakeは、golangを初めて学ぶ際に混同しやすく、ポインタを渡す必要がある場合にも誤ってmakeを使用することがあります。この2つの違いを知ることは非常に重要です。

追加の読み物

次の記事

バースデーパラドックス

前の記事

vuex と webpack の動的インポートによりモジュールを動的にロードする

この文章が役に立つと思うなら、下のリンクで応援してくれると大変嬉しいです✨

Buy me a coffee

作者

Kalan 頭像照片,在淡水拍攝,淺藍背景

愷開 | Kalan

Kalan です。台湾出身で、2019年に日本へ転職し、福岡に住んでいます。フロントエンド開発に精通しているだけでなく、IoT、アプリ開発、バックエンド、電子工作などの分野にも挑戦しています。 最近、エレキギターを始めました。ブログを通じて、より多くの人と交流できればと思っています。気軽に絡んでください