我正在玩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)
Run Code Online (Sandbox Code Playgroud)
您首选的语法是什么?为什么?
谢谢,SO伙计们!
我已经将你的例子编号为1-5,我将在这里介绍它们.希望这可以帮助!
var strArr0 *[10]string = new([10]string) // (1)
Run Code Online (Sandbox Code Playgroud)
这将分配一个长度为10的新字符串数组,并返回指向该数组的指针.
var strArr1 = new([10]string) // (2)
Run Code Online (Sandbox Code Playgroud)
这与1完全相同.它只是简写,由于Go的类型推断而起作用.它可以进一步缩短为:
strArr1 := new([10]string) // (2a)
Run Code Online (Sandbox Code Playgroud)
其中1,2,2a都产生完全相同的结果.
var strArr2 = make([]string,10) // (3)
Run Code Online (Sandbox Code Playgroud)
这会产生一段长度为10的字符串.切片指的是底层数组的某个子集.来自golang规范:
make()调用分配一个新的隐藏数组,返回的切片值引用该数组.
Run Code Online (Sandbox Code Playgroud)make([]T, length, capacity)生成与分配数组和切片相同的切片,因此这两个示例产生相同的切片:
Run Code Online (Sandbox Code Playgroud)make([]int, 50, 100) new([100]int)[0:50]
所以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
Run Code Online (Sandbox Code Playgroud)
根据您正在创建的类型使用new或make.make仅用于切片,地图和通道.他们使用了一个不同的关键字来传达这样的想法:make正在初始化一些数据结构,而不仅仅是将内存归零.
下一个是回到数组而不是切片:
var strArr3 [10]string // (4)
Run Code Online (Sandbox Code Playgroud)
这与1,2和2a相同.
strArr4 := make([]string,10) // (5)
Run Code Online (Sandbox Code Playgroud)
与3.:=相同只是初始化变量时的简写,可以推断出类型.
那么选择哪个?这取决于您的个人风格,但一般来说,一个选择显然会最大限度地提高代码的清晰度,例如在类型明显时使用类型推断:
foo := bar.ToStringArray()
Run Code Online (Sandbox Code Playgroud)
或者在不太常见的情况下声明类型,类型将有助于查看:
var foo []string = bar.DoSomethingOpaque()
Run Code Online (Sandbox Code Playgroud)
在切片与数组之间,您通常会创建您正在调用的某些函数所需的任何类型.