首选声明/初始化方法

jid*_*eel 3 syntax go

我正在玩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伙计们!

Mik*_*row 7

我已经将你的例子编号为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()调用分配一个新的隐藏数组,返回的切片值引用该数组.

make([]T, length, capacity)
Run Code Online (Sandbox Code Playgroud)

生成与分配数组和切片相同的切片,因此这两个示例产生相同的切片:

make([]int, 50, 100)
new([100]int)[0:50]
Run Code Online (Sandbox Code Playgroud)

所以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)

在切片与数组之间,您通常会创建您正在调用的某些函数所需的任何类型.