2016-04-01 4 views
3

機能makeは次のように説明している:golang make関数はどのように3つのパラメータを取ることができますか?

func make(Type, size IntegerType) Type 

私たちは時々スライスするmakeを使用する場合、それは次のように示しています。だから私の質問がある

make([]int, 0, 10) 

make機能を取ることができますどのように3つのパラメータ? size IntegerTypeは、Varargではありません。私は混乱しています...

答えて

0

この機能はmakeis a builtin functionです。この関数には、他の関数では使用できないいくつかの機能があります。 1つは、あなたが指摘したように、可変の引数を取ることです。もう一つは、最初の引数が型であるということです。

function definition func make(Type, size IntegerType) Typeは、文書化のみを目的としています。関数の実際の定義ではありません。

1

make()関数は正規関数ではありません。組み込み関数は言語仕様の一部です。 builtinパッケージ(builtin.make())に記載されているのは、ドキュメンテーションの目的のみです。それは関数の実際の署名ではありません。 3番目のオプションのパラメータは容量です。これは、スライスを作成するときにのみ提供されます。

これは仕様で説明しています:Making slices, maps and channels:

make(T, n)  slice  slice of type T with length n and capacity n 
make(T, n, m) slice  slice of type T with length n and capacity m 

そしてまた、与えられた要素型Tのための新しい、初期化されたスライス値は組み込み関数makeを使用して作られてSlice types:

で言及これは、スライスタイプと、長さがで、オプションとして容量がであることを指定するパラメータです。 makeで作成されたスライスは、返されたスライス値が参照する新しい隠し配列を常に割り当てます。

make([]int, 50, 100) 
new([100]int)[0:50] 
5

make機能が内蔵の束の一つである:それは

make([]T, length, capacity) 

を実行するアレイを割り当て、それをスライスと同一のスライスを生成するので、これらの2つの式が等価ですあなたのGoコードで達成できないこと(少なくともきれいで簡単にはできないこと)を可能にする機能では、 それは( https://golang.org/ref/spec#Making_slices_maps_and_channelsを参照)マップ、チャンネルやスライスを作成するためのオーバーロードされたフォームの数を持っています

あなたの混乱は、おそらく署名func make(Type, size IntegerType) Typeを持つものとしてmakeを示しているhttps://golang.org/pkg/builtin/#makeに由来します。

スライス:あなたがそのセクションでよく見る場合 は、あなたもmakeは三番目の引数を持つことができるという表示を見るであろう大きさは長さを指定します。スライスの容量は、その長さに等しい です。第2の整数引数を に提供して、別の容量を指定することができます。;それは長さよりも小さくてはならない、 ので([] INT、0、10)あなたは、makeが整数なしにも使用することができることにも気づくことができる長さ0と容量10

のスライスを割り当てします引数:

マップ:初期割り当てサイズに従って製造されるが、 得られるマップは 小さい出発サイズが割り当てられている場合にはサイズが省略することができる長さ0 を有します。

チャネル:チャネルのバッファは、指定されたバッファ容量で初期化されます。ゼロの場合、またはサイズがを省略すると、チャネルはバッファリングされません。

関連する問題