在Go中,您可以通过以下方式初始化空字符串(在函数中):
{{1}}
据我所知,每个语句在语义上都是相同的。其中一个比其他人更惯用吗?
答案 0 :(得分:2)
您应该选择使代码更清晰的选择。如果实际使用零值(例如,当您以空字符串开头并将其他字符串连接到它时),则使用:=
表单可能最为清晰。如果您只是声明变量,并且稍后将为其分配不同的值,请使用var
。
答案 1 :(得分:1)
没有正确的方式来声明空变量,但有一些事情要记住,就像你不能使用:=
以外的var
快捷方式一个函数体,就像var (
name string
age int64
)
:
var name = ""
我发现var name string
是最清晰的指示,表明您正在声明一个空变量,但我喜欢{{1> 的显式性{{1 }}。无论如何,请考虑 where 来声明变量。有时在函数体外部的所有部分都是合适的,但通常最接近实际使用它的地方是最好的。
rob(Pike?)在mailthread上写了顶级声明
在顶层,var(或const或type或func)是必需的:每个项必须由关键字引入,以解决与识别语句边界相关的ur-syntactic原因。由于后来的更改涉及分号,我相信在某些情况下可以消除对var的需要,但由于const,type和func必须保留,因此它不是一个令人信服的论据。
&#34>短变量"存在一定的歧义。声明(使用:=
),关于变量是声明还是重新声明,如specs中所述:
与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在相同的块中声明(或者如果块是函数体,则参数列表)具有相同的类型,并且至少有一个非变量声明-blank变量是新的。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新变量;它只是为原始版本赋予了一个新值。
答案 2 :(得分:0)
生成的代码(使用当前编译器 - Go 1.7.4)完全没有区别,并且gometalinter
也不会抱怨任何这些代码。使用您喜欢的任何一种。
一些差异:
使用短变量声明,您可以在一行中创建多种类型的变量,例如
a, b := "", 0
以下3个应用生成相同的代码:
a.go
package main
import "fmt"
func main() { var a string; fmt.Println(a) }
b.go
package main
import "fmt"
func main() { var a = ""; fmt.Println(a) }
c.go
package main
import "fmt"
func main() { a := ""; fmt.Println(a) }
要验证,构建每个(例如使用go build -o a
),并在Linux上使用diff
来比较可执行二进制文件:
diff a b && diff a c
答案 3 :(得分:0)
var a string
对于不太流利的人来说,它不是立即可见的空字符串。有些人可能期望它有一些零/零值。
var b = ""
将是最明确的,意味着每个人都认为它是一个包含空字符串的变量。
b := ""
:= =在这种情况下,分配是如此常见,以至于我认为它是最具可读性的。除非它当然不属于功能体。
答案 4 :(得分:0)
由于几个原因,我试图坚持简短声明。
虽然var a string
和a := ""
相同,但b := []T{}
和var b []T
并不相同。处理切片和贴图时,较短的声明不会为零。更常见的是(特别是对于地图)我想要分配内存。
在某些情况下,需要var
,例如,您正在调用一个将填充类型属性的函数。
var err error
foo.Name, err = getFooName()
在上述情况下使用:=
语法会因为已声明foo.Name
而错误输出。