我发现var name = ""是声明空变量的最清晰的指示,但是我喜欢var name string的type显式性。无论如何,一定要考虑在哪里声明变量。有时候在函数体之外一次声明变量是合适的,但是通常离实际使用变量的地方最近是最好的。 rob(Pike?)在邮件线程上写了关于顶级声明的内容 在顶层,var(或const或type或func)是必需的:由于识别语句边界的语法原因,每一项都必须由关键字引入,随着后来涉及分号的更改,我相信在某些情况下消除对var的需要成为可能,但由于const、type和func必须保留,因此这不是一个令人信服的论点。 在“short-variable”声明(使用:=)中存在一定的模糊性,如规范中所述,变量是声明的还是重新声明的: 与常规变量声明不同,短变量声明可以重新声明变量,前提是这些变量最初在同一块(或参数列表,如果块是函数体)中以相同类型声明,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不引入新变量;它只是给原始值赋一个新值。
6条答案
按热度按时间ecbunoof1#
你应该选择让代码更清晰的形式。如果零值实际上会被使用(例如,当你以一个空字符串开始并将其他字符串连接到它时),使用
:=
形式可能是最清晰的。如果你只是声明变量,并将在稍后给它赋一个不同的值,使用var
。v440hwme2#
对于不太精通go的人来说,这不是一个直接可见的空字符串,有些人可能会认为它是一个null/nil值。
是最明显的,意味着每个人都看到它是一个包含空字符串的变量。
:=赋值语句在go中非常常见,在我看来它是最可读的,当然除非它在函数体之外。
jslywgbw3#
声明空变量并没有一个 * 正确 * 的方法,但是有一些事情需要记住,比如你不能在函数体之外使用
:=
的快捷方式,而var
可以:我发现
var name = ""
是声明空变量的最清晰的指示,但是我喜欢var name string
的type显式性。无论如何,一定要考虑在哪里声明变量。有时候在函数体之外一次声明变量是合适的,但是通常离实际使用变量的地方最近是最好的。rob(Pike?)在邮件线程上写了关于顶级声明的内容
在顶层,var(或const或type或func)是必需的:由于识别语句边界的语法原因,每一项都必须由关键字引入,随着后来涉及分号的更改,我相信在某些情况下消除对var的需要成为可能,但由于const、type和func必须保留,因此这不是一个令人信服的论点。
在“short-variable”声明(使用
:=
)中存在一定的模糊性,如规范中所述,变量是声明的还是重新声明的:与常规变量声明不同,短变量声明可以重新声明变量,前提是这些变量最初在同一块(或参数列表,如果块是函数体)中以相同类型声明,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不引入新变量;它只是给原始值赋一个新值。
eufgjt7s4#
在生成的代码中绝对没有任何区别(使用当前的编译器-Go语言1.7.4),而且
gometalinter
也不会抱怨任何一个。一些差异:
以下3个应用程序生成相同的代码:
a.go
b.go
c.go
要进行验证,请构建每一个(例如,使用
go build -o a
),并在Linux上使用diff
比较可执行二进制文件:mftmpeh85#
我尽量坚持简短的声明有几个原因。
1.它比较短
1.一致性
1.为Map、切片以及指向结构和类型的指针分配内存。
虽然
var a string
和a := ""
是一样的,但是b := []T{}
和var b []T
是不一样的。当处理切片和Map时,较短的声明不会是nil。通常情况下(尤其是Map),我需要分配内存。在很少的情况下需要使用
var
,例如,您正在调用一个将填充某个类型的属性的函数。在上述情况下使用
:=
语法将出错,因为foo.Name
已经声明。62lalag46#
公正
stackoverf中的东西只和go中的空字符串相关,所以应该在这里