Go 言語の new キーワードと make キーワードの違いについて話しましょう

PHPz
リリース: 2023-03-27 17:16:36
転載
761 人が閲覧しました

この記事では、非常に一般的な面接の質問を紹介します。どのくらい一般的ですか?これが多くの面接の出発点となる可能性があります。これが、new と make の 2 つの組み込み関数の違いです。

Go 言語の new キーワードと make キーワードの違いについて話しましょう

実は、問題自体は複雑ではなく、簡単に言うと、 new はメモリを割り当てるだけで、make はスライス、マップ、チャンの初期化にのみ使用できます。について詳しくご紹介しましょう。

new

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)
ログイン後にコピー

これは新しい関数。返されるのは常に、割り当てられた型のメモリ アドレスを指す型のポインタです。新しい関数はメモリ空間を割り当てるだけで、メモリ空間を初期化しないことに注意してください。

#make

#make はメモリ割り当てにも使用されますが、new とは異なり、スライス、マップ、チャンのメモリ作成とその型にのみ使用されます。これは 3 つの型そのものであり、ポインタ型ではありません。これら 3 つの型自体は参照型であるため、ポインタを返す必要はありません。

関数のシグネチャは次のとおりです:

ソース コード
// 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 のいずれかであり、戻り値もその型そのものです。

Use

以下ではスライスを使用して例を示します:

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 は似ているので、詳細は説明しません。

要約

上記の分析を通じて、new と make の主な違いは次のように要約されます。スライス、マップ、およびチャネル タイプのデータの配布および初期化にのみ使用されます。 new は任意のタイプのデータを割り当てることができます。

    new 割り当ては、タイプ
  • *Type

    であるポインタを返します。 make は型自体を返します (例:

    Type
  • ;
  • new 割り当てられたスペースはクリアされます)。 make がスペースを割り当てた後、初期化されます;

  • 推奨される学習: "
  • ビデオ チュートリアルに進む

    "

以上がGo 言語の new キーワードと make キーワードの違いについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!