Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 首选的声明/初始化方法_Syntax_Go - Fatal编程技术网

Syntax 首选的声明/初始化方法

Syntax 首选的声明/初始化方法,syntax,go,Syntax,Go,我目前正在玩Google Go。 有很多方法可以声明和/或初始化变量。 有人能解释每种方法的优缺点吗(据我所知,示例如下): 您喜欢的语法是什么,为什么? 谢谢,伙计们 首先,您应该了解数组和切片之间的区别。数组被视为值,因此如果将它们传递给函数,它们将被复制。另一方面,切片是对底层数组的引用,因此如果将切片传递给函数,函数变量仍将引用相同的底层数组 在您的示例中,前两个是相同的,只是第一个在变量声明中指定了类型。让我们这样做吧,它在某些情况下可能会有所帮助——比如当您试图将变量声明为接口而不是

我目前正在玩Google Go。
有很多方法可以声明和/或初始化变量。
有人能解释每种方法的优缺点吗(据我所知,示例如下):

您喜欢的语法是什么,为什么?

谢谢,伙计们

首先,您应该了解数组和切片之间的区别。数组被视为值,因此如果将它们传递给函数,它们将被复制。另一方面,切片是对底层数组的引用,因此如果将切片传递给函数,函数变量仍将引用相同的底层数组

在您的示例中,前两个是相同的,只是第一个在变量声明中指定了类型。让我们这样做吧,它在某些情况下可能会有所帮助——比如当您试图将变量声明为接口而不是值时(即var i io.Reader=os.Open(…)

第三个和第五个(
var strArr2=make([]string,10)
strArr4:=make([]string,10)
)是等效的,但后者使用了变量声明的简写形式,这通常可以节省大量的键入

第四个只是声明一个数组值

除非处理网络数据,否则我很少在代码中处理数组。因此,我首选的语法是:

s := 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的字符串片段。片段指的是基础数组的某个子集。来源:

make()调用分配一个新的, 返回到的隐藏数组 切片值引用

生成与分配数组并对其进行切片相同的切片, 因此,这两个示例产生相同的切片:

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
new或make的使用取决于您创建的类型。make仅用于切片、贴图和频道。他们使用不同的关键字来传达这样的想法,即make是在幕后初始化某些数据结构,而不仅仅是将内存归零

下一步是返回到阵列而不是切片:

var strArr3 [10]string  // (4)
这与1、2和2a相同

strArr4 := make([]string,10)  // (5)
与3相同。:=只是初始化变量时的简写,可以推断类型


那么选择哪一种呢?这取决于你的个人风格,但一般来说,一种选择显然会最大限度地提高代码的清晰度,例如,在类型明显时使用类型推断:

foo := bar.ToStringArray()
或者在不太重要的情况下声明类型,该类型将非常有用:

var foo []string = bar.DoSomethingOpaque()

在片和数组上,您通常会创建所调用的某些函数所需的任何类型。

您能指定方法1和2与3和5的区别吗?我知道1和2以及3和5分别是相同的,但我不确定何时/为什么要使用其中一个而不是另一个。我从未使用过固定大小的字符串数组(1或2),但我一直使用字符串数组的切片(3和5),因为vector.StringVector就是这样。我在解析网络数据时使用了固定大小的数组。例如,将一些编码选项读入固定大小数组
scratch[4]byte
。顺便说一句,即使4)似乎在未初始化的情况下声明数组值,也就是说,在不使用“new”或“make”的情况下,仍然可以(令人惊讶地?)填充相关数组:var strArr3[10]string strArr3[0]=“bla”os.Stdout.WriteString(strArr3[0]+“\n”)显示“bla”。
strArr4 := make([]string,10)  // (5)
foo := bar.ToStringArray()
var foo []string = bar.DoSomethingOpaque()