2017-05-29 7 views
1

今日、私はGolangを学習しており、Golangの動作を理解していません。varキーワードを使用してスライスを初期化する

ここでは、短い手でスライスの宣言と初期化です:一方

ilist := []int{1, 2, 3} //it works 

私はvarキーワードを使用してそれを宣言して初期化しようとした場合、それはエラーを与える:

var ilist [] int = {1, 2, 3, 4, 5} //error 

私はちょうど変数(ないスライス)を初期化する場合は、正常に動作します:

var i int = 5 // works fine 

なぜGolangはこのように動作しますか、具体的な理由はありますか?

ことだ
+3

私はGoで経験はありませんが、私は言語仕様を簡単に見ました。あなたは 'var ilist [] int = [] int {1、2、3}'を試しましたか?スライスのような複合リテラルには、数値や文字列などの基本リテラルとは対照的に、タイプが必要です。 'var ilist = [] int {1、2、3}'のようにvar名の後に型を省略することもできます。 – JayK

+0

はい、私はすべての情報を宣言(var ilist [] int)の左側に複合リテラルを作成するために与えるので、あなたは正しいが、まだ奇妙です。 – iyasar

答えて

5

i give the all information to create composite literal

:あなたはは、複合リテラルを作成するために必要なすべての情報を与えませんでした。何が必要なのか調べるには、Spec: Composite literalsのセクションをご覧ください。

{1, 2, 3, 4, 5} 

このリテラルミスタイプ情報:

このリテラル

[]int{}リテラルの一部でもかまいませんが、 []float32{}リテラルの一部でもかまいません。構造体タイプが intフィールド(たとえば type Ints struct{a,b,c,d,e int})の構造リテラルの一部であってもかまいません。

はい、この変数宣言で

var ilist [] int = {1, 2, 3, 4, 5} //error 

のみ[]int{}リテラルは理にかなって、それは行くがどのように動作するかではありません。この行を有効にするタイプが1つだけであるため、省略することはできません。

それが初期化式から推測できるので、これらの形態の両方が有効な場合しかし、あなたは宣言からタイプを省略することに注意してください:

var ilist1 []int = []int{1, 2, 3, 4, 5} 

var ilist2 = []int{1, 2, 3, 4, 5} 

しかし{1, 2, 3, 4, 5}のタイプがあいまいになる(場合それは有効です)。

はまた、あなたが[][]intのようなタイプのための複合リテラルを指定している場合、それは、複合リテラルの種類から知られているので、あなたが、要素のリテラル(サブ)からタイプを省略する場合があることに注意しますこれはも有効です。

var iilist = [][]int{ 
    {1, 2, 3}, 
    {4, 5, 6}, 
} 

同じマップリテラルのために行く、これが有効である(Go 1.5に追加されました):

var imap = map[int][]int{ 
    1: {1, 2, 3}, 
    2: {4, 5, 6}, 
} 

Go Playgroundにこれらを試してみてください。

0

移動中、different names mean different types。したがって、変数を定義するときには、変数の型を指定する必要があります。つまり、割り当てが具体的なタイプであることを確認する必要があります。 "{}"は複数の型にすることができるので、コンパイラはilist型を見つけることができません。ところで、いくつかの友人がディスカッションを開始しましたProposal: Alias declarations for Go

関連する問題