この記事では、非常に一般的な面接の質問を紹介します。どのくらい一般的ですか?これが多くの面接の出発点となる可能性があります。これが、new と make の 2 つの組み込み関数の違いです。
実は、問題自体は複雑ではなく、簡単に言うと、 new はメモリを割り当てるだけで、make はスライス、マップ、チャンの初期化にのみ使用できます。について詳しくご紹介しましょう。
new は、メモリを割り当て、そのメモリへのポインタを返す組み込み関数です。
関数のシグネチャは次のとおりです:
// The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that type. func new(Type) *Type
上記のコードからわかるように、新しい関数は 1 つのパラメーターのみを受け入れます。これは型であり、その型のメモリ アドレスへのポインタを返します。
同時に、新しい関数は割り当てられたメモリをゼロ、つまり型のゼロ値に設定します。
new 関数を使用して変数にメモリ領域を割り当てます:
p1 := new(int) fmt.Printf("p1 --> %#v \n ", p1) //(*int)(0xc42000e250) fmt.Printf("p1 point to --> %#v \n ", *p1) //0 var p2 *int i := 0 p2 = &i fmt.Printf("p2 --> %#v \n ", p2) //(*int)(0xc42000e278) fmt.Printf("p2 point to --> %#v \n ", *p2) //0
上記のコードは同等です、new(int)
割り当てられた領域を int のゼロ値、つまり 0 に初期化し、int のポインタを返します。これは、ポインタを直接宣言して初期化するのと同じ効果があります。
もちろん、新しい関数はシステムのデフォルトのデータ型にスペースを割り当てるだけでなく、以下に示すように、カスタム型も新しい関数を使用してスペースを割り当てることができます:
type Student struct { name string age int } var s *Student s = new(Student) //分配空间 s.name = "zhangsan" fmt.Println(s)
これは新しい関数。返されるのは常に、割り当てられた型のメモリ アドレスを指す型のポインタです。新しい関数はメモリ空間を割り当てるだけで、メモリ空間を初期化しないことに注意してください。
// The make built-in function allocates and initializes an object of type // slice, map, or chan (only). Like new, the first argument is a type, not a // value. Unlike new, make's return type is the same as the type of its // argument, not a pointer to it. The specification of the result depends on // the type: // Slice: The size specifies the length. The capacity of the slice is // equal to its length. A second integer argument may be provided to // specify a different capacity; it must be no smaller than the // length, so make([]int, 0, 10) allocates a slice of length 0 and // capacity 10. // Map: An empty map is allocated with enough space to hold the // specified number of elements. The size may be omitted, in which case // a small starting size is allocated. // Channel: The channel's buffer is initialized with the specified // buffer capacity. If zero, or the size is omitted, the channel is // unbuffered. func make(t Type, size ...IntegerType) Type
t## が# make 関数のパラメータは、slice、map、chan のいずれかであり、戻り値もその型そのものです。
var s1 []int if s1 == nil { fmt.Printf("s1 is nil --> %#v \n ", s1) // []int(nil) } s2 := make([]int, 3) if s2 == nil { fmt.Printf("s2 is nil --> %#v \n ", s2) } else { fmt.Printf("s2 is not nill --> %#v \n ", s2)// []int{0, 0, 0} }
スライスのゼロ値は
nilですが、 make を使用します。 初期化後、スライスの内容は、[]int{0, 0, 0}
のように、int 型のゼロ値で埋められます。map と chan は似ているので、詳細は説明しません。
であるポインタを返します。 make は型自体を返します (例:
Typenew 割り当てられたスペースはクリアされます)。 make がスペースを割り当てた後、初期化されます;
"
以上がGo 言語の new キーワードと make キーワードの違いについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。