2014-11-24 39 views
3

我想在結構中創建數組數組的複合文字。在結構之外創建數組陣列的複合文字

package main 

import "fmt" 

func main() { 
    x := [...][]string {{"a", "b"}} 

    fmt.Printf("%s", x) 
} 

工作。 (http://play.golang.org/p/C2RbNnd7LL

但我無法在結構中定義[...] []字符串類型的字段。如在http://play.golang.org/p/wHNeeuAJuO

package main 

import "fmt" 

type t struct { 
    f [...][]string 
} 

func main() { 
    x := [...][]string {{"a", "b"}} 
    y := t{x} 
    fmt.Printf("%s", y) 
} 

F給出陣列字面

+0

當然,它給出了一個錯誤! Go中的數組具有編譯時固定長度。爲了禮貌,編譯器會爲你計算一個數組的**元素;那是'...'。沒有文字,沒有計數,沒有'...',只是說明數組的大小或去一個切片。看看http://blog.golang.org/slices。並且請:不要叫一個陣列或反之亦然(因爲每次有人做一隻小貓死亡)。這只是一個語法錯誤,與Go的數組和片斷的誤解相結合。你完成了Go遊覽? – Volker 2014-11-25 00:41:01

+0

可能會在這裏向您展示一些不合適的模式,但是一旦您*使用切片,您可以選擇如何編寫文字:http://play.golang.org/p/X1Pwsp0nK2 – twotwotwo 2014-11-25 01:46:35

回答

1

之外errror使用[...]陣列的問題是,[...]elementType不是有效的類型名稱。您可以使用帶有初始化語法(如[...]int{1, 2, 3, 4})的語法,因爲編譯器可以查看確定實際類型的數量(此例中爲[4]int)。

如果希望不具有固定的編譯時大小的陣列狀的類型,使用一個切片:

type t struct { 
    f [][]string 
} 

或者,如果元件的數目是固定在編譯時和您仍希望要使用數組,您需要在類型定義中指定實際的元素數量。

1

短的答案:

的符號[...]可以用於構建數組文本,但不能在一個數組聲明被使用。在您提供的示例中,[...]表示法用於聲明結構元素。因此錯誤。將[...]替換爲[n],其中n是陣列的實際大小。

龍答案:

不像許多其他的編程語言,圍棋包括陣列的長度作爲類型信息的一部分。因此,Go中沒有類型只是數組,但它始終是特定大小的數組。例如,在下面的代碼中,有兩個int數組,其中一個是[3]int類型,另一個是[4]int類型,並且由於它們的類型不同,因此分配一個是非法的。

package main 

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    a := [...]int{1, 2, 3} 
    b := [...]int{1, 2, 3, 4} 
    fmt.Println(reflect.TypeOf(a), reflect.TypeOf(b)) 
} 

這個程序打印[3]int [4]int到控制檯,並說明了在這個方案ab是不同類型的(發現here on the Go Playground)。由於這些是不同的類型,分配ab(或反之亦然)是非法的,並導致編譯錯誤:cannot use b (type [4]int) as type [3]int in assignment

[...]符號:該[...]只能用作文字的一部分,它表示編譯器應該從文字本身推斷數組的長度。這從程序員中去除了數組中元素數量的負擔。但是,如果文字中包含的元素數量儘可能多或更少(在這種情況下,結果數組中的其餘元素爲空),仍然可以在文字中指定大小。對於例如a := [4]int{1,2}是合法的,將創建數組:[1 2 0 0]

[...]符號不能在變量聲明中使用,因此這種說法是無效的:var x [...]int。同樣,在你的例子的結構的類型定義中,這個語句是非法的:f [...][]string,並且要求你指定數組的大小。