我已經編號的例子1-5,我會穿行他們在這裏。希望這有助於!
var strArr0 *[10]string = new([10]string) // (1)
這將分配一個長度爲10的新字符串數組,並返回一個指向該數組的指針。
var strArr1 = new([10]string) // (2)
這和1完全一樣。它只是速記,因爲Go的類型推斷有效。它可以進一步縮短爲:
strArr1 := new([10]string) // (2a)
其中1,2,2a都產生完全相同的結果。
var strArr2 = make([]string,10) // (3)
這會產生一個字符串切片,長度爲10.切片引用基礎數組的一部分子集。從the golang spec:
本作()調用分配一個新的, 隱藏的陣列,其返回 切片值指。
make([]T, length, capacity)
產生相同的切片作爲分配的陣列和切片它, 所以這兩個例子導致相同的切片:
make([]int, 50, 100)
new([100]int)[0:50]
SO 3是相當於以下任何一項:
var strArr2 = new([10]string)[0:10] // Slicing an explicitly created array
var strArr2 []string = new([10]string)[0:10] // Explicitly declaring the type of strArr2, rather than inferring
strArr2 := new([10]string)[0:10] // Using the := shorthand instead of var
根據您創建的類型使用新建或製作。 make僅用於切片,地圖和頻道。他們用一個不同的關鍵字來表達這樣的想法:make正在初始化一些數據結構,而不是僅僅調整內存。
下一個是回陣列而不是切片:
var strArr3 [10]string // (4)
這是相同的1,2,和2a。
strArr4 := make([]string,10) // (5)
與3相同:=只是初始化變量時的簡寫,可以推斷出類型。
那麼哪個選擇?這完全取決於你的個人風格,但總的來說,一個選擇顯然會最大程度地提高代碼的清晰度,例如使用類型推斷當類型是顯而易見的:
foo := bar.ToStringArray()
或聲明的類型時,它沒有那麼和類型將看到有用:
var foo []string = bar.DoSomethingOpaque()
在片與陣列,你通常會創建無論你正在調用的某個函數需要什麼類型。
你可以指定不同的方法1和2和3和5嗎?我知道1&2和3&5分別是相同的,但我不確定何時/爲什麼要使用另一個。 – jlv 2010-10-18 16:22:44
我從來不需要使用固定大小的字符串數組(1或2),但我始終使用字符串數組(3和5)的切片,因爲這就是vector.StringVector的原因。 我在解析網絡數據時使用了固定大小的數組。例如,[zlib reader](http://golang.org/src/pkg/compress/zlib/reader.go)將一些編碼選項讀入固定大小的數組'scratch [4] byte'中。 – marketer 2010-10-19 00:52:57
順便說一句,即使4)似乎在不初始化的情況下聲明一個數組值,即不使用'new'或'make',它仍然可能填充相關數組: var strArr3 [10]字符串 strArr3 [0] =「bla」 os.Stdout.WriteString(strArr3 [0] +「\ n」) 顯示「bla」。 – jideel 2010-10-19 16:17:56