2010-10-18 56 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