首选声明/初始化方法
我目前正在玩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)
什么是您首选的语法,为什么?
谢谢,所以人家!
我已经编号的例子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()
在片与阵列,你通常会创建无论你正在调用的某个函数需要什么类型。
首先您应该了解数组和切片之间的区别。数组被视为值,因此如果将它们传递给函数,它们将被复制。另一方面,切片是对底层数组的引用,所以如果将切片传递给函数,函数变量仍将引用相同的底层数组。
在你的例子中,前两个是相同的,它只是第一个指定变量声明中的类型。让你这样做,它可能有助于在某些情况下 - 比如当你试图声明一个变量是一个接口而不是一个值(即var i io.Reader = os.Open(...)) 。
第三和第五(,strArr4 := make([]string,10)
是等效的,但后者使用变量声明的短手形式,其常常可以节省大量的输入。
第四只是声明一个数组值。 。
我很少在我的编码阵列处理,除非我与网络数据工作,所以我首选的语法是:
s := make([]string, 10)
你可以指定不同的方法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