2010-10-18 138 views
3

我目前正在玩Google Go。
有很多方法來聲明和/或初始化變量。
有人能解釋每一種方式優點/缺點(樣品,據我所知,下同):首選聲明/初始化方法

var strArr0 *[10]string = new([10]string) 

    var strArr1 = new([10]string) 

    var strArr2 = make([]string,10) 

    var strArr3 [10]string 

    strArr4 := make([]string,10) 

什麼是您首選的語法,爲什麼?
謝謝,所以人家!

回答

7

我已經編號的例子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() 

在片與陣列,你通常會創建無論你正在調用的某個函數需要什麼類型。

2

首先您應該瞭解數組和切片之間的區別。數組被視爲值,因此如果將它們傳遞給函數,它們將被複制。另一方面,切片是對底層數組的引用,所以如果將切片傳遞給函數,函數變量仍將引用相同的底層數組。

在你的例子中,前兩個是相同的,它只是第一個指定變量聲明中的類型。讓你這樣做,它可能有助於在某些情況下 - 比如當你試圖聲明一個變量是一個接口而不是一個值(即var i io.Reader = os.Open(...)) 。

第三和第五(​​,strArr4 := make([]string,10)是等效的,但後者使用變量聲明的短手形式,其常常可以節省大量的輸入。

第四隻是聲明一個數組值。 。

我很少在我的編碼陣列處理,除非我與網絡數據工作,所以我首選的語法是:

s := make([]string, 10) 
+0

你可以指定不同的方法1和2和3和5嗎?我知道1&2和3&5分別是相同的,但我不確定何時/爲什麼要使用另一個。 – jlv 2010-10-18 16:22:44

+0

我從來不需要使用固定大小的字符串數組(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

+0

順便說一句,即使4)似乎在不初始化的情況下聲明一個數組值,即不使用'new'或'make',它仍然可能填充相關數組: var strArr3 [10]字符串 strArr3 [0] =「bla」 os.Stdout.WriteString(strArr3 [0] +「\ n」) 顯示「bla」。 – jideel 2010-10-19 16:17:56