在Go中初始化空字符串的惯用法

时间:2017-01-17 16:19:13

标签: go

在Go中,您可以通过以下方式初始化空字符串(在函数中):

{{1}}

据我所知,每个语句在语义上都是相同的。其中一个比其他人更惯用吗?

5 个答案:

答案 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)

由于几个原因,我试图坚持简短声明。

  1. 它的缩短
  2. 一致性
  3. 为地图,切片和指向结构和类型的指针分配内存。
  4. 虽然var a stringa := ""相同,但b := []T{}var b []T并不相同。处理切片和贴图时,较短的声明不会为零。更常见的是(特别是对于地图)我想要分配内存。

    在某些情况下,需要var,例如,您正在调用一个将填充类型属性的函数。

    var err error
    foo.Name, err = getFooName()
    

    在上述情况下使用:=语法会因为已声明foo.Name而错误输出。