Go语言中初始化空字符串的惯用方法

6ju8rftf  于 2023-01-03  发布在  Go
关注(0)|答案(6)|浏览(269)

在Go语言中,你可以用以下方法初始化一个空字符串(在函数中):

var a string
var b = ""
c := ""

据我所知,每一句话在语义上都是一样的。是不是其中一句比其他的更地道?

ecbunoof

ecbunoof1#

你应该选择让代码更清晰的形式。如果零值实际上会被使用(例如,当你以一个空字符串开始并将其他字符串连接到它时),使用:=形式可能是最清晰的。如果你只是声明变量,并将在稍后给它赋一个不同的值,使用var

v440hwme

v440hwme2#

var a string

对于不太精通go的人来说,这不是一个直接可见的空字符串,有些人可能会认为它是一个null/nil值。

var b = ""

是最明显的,意味着每个人都看到它是一个包含空字符串的变量。

b := ""

:=赋值语句在go中非常常见,在我看来它是最可读的,当然除非它在函数体之外。

jslywgbw

jslywgbw3#

声明空变量并没有一个 * 正确 * 的方法,但是有一些事情需要记住,比如你不能在函数体之外使用:=的快捷方式,而var可以:

var (
    name string
    age  int64
)

我发现var name = ""是声明空变量的最清晰的指示,但是我喜欢var name stringtype显式性。无论如何,一定要考虑在哪里声明变量。有时候在函数体之外一次声明变量是合适的,但是通常离实际使用变量的地方最近是最好的。
rob(Pike?)在邮件线程上写了关于顶级声明的内容
在顶层,var(或const或type或func)是必需的:由于识别语句边界的语法原因,每一项都必须由关键字引入,随着后来涉及分号的更改,我相信在某些情况下消除对var的需要成为可能,但由于const、type和func必须保留,因此这不是一个令人信服的论点。
在“short-variable”声明(使用:=)中存在一定的模糊性,如规范中所述,变量是声明的还是重新声明的
与常规变量声明不同,短变量声明可以重新声明变量,前提是这些变量最初在同一块(或参数列表,如果块是函数体)中以相同类型声明,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不引入新变量;它只是给原始值赋一个新值。

eufgjt7s

eufgjt7s4#

在生成的代码中绝对没有任何区别(使用当前的编译器-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
mftmpeh8

mftmpeh85#

我尽量坚持简短的声明有几个原因。
1.它比较短
1.一致性
1.为Map、切片以及指向结构和类型的指针分配内存。
虽然var a stringa := ""是一样的,但是b := []T{}var b []T是不一样的。当处理切片和Map时,较短的声明不会是nil。通常情况下(尤其是Map),我需要分配内存。
在很少的情况下需要使用var,例如,您正在调用一个将填充某个类型的属性的函数。

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

在上述情况下使用:=语法将出错,因为foo.Name已经声明。

62lalag4

62lalag46#

公正

*new(string)

stackoverf中的东西只和go中的空字符串相关,所以应该在这里

相关问题