カランのブログ

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

四零二曜日電子報上線啦!訂閱訂起來

ソフトウェアエンジニア / 台湾人 / 福岡生活
このブログはRSS Feed をサポートしています。RSSリンクをクリックして設定してください。技術に関する記事はコードがあるのでブログで閲覧することをお勧めします。

今のモード ライト

我會把一些不成文的筆記或是最近的生活雜感放在短筆記,如果有興趣的話可以來看看唷!

記事のタイトルや概要は自動翻訳であるため(中身は翻訳されてない場合が多い)、変な言葉が出たり、意味伝わらない場合がございます。空いてる時間で翻訳します。

新品と新品の違い

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