对于测试非空字符串(在Go中),哪种方法是最好的(最常用的)?

if len(mystring) > 0 { }

Or:

if mystring != "" { }

还是别的什么?


当前回答

这两种样式都在Go的标准库中使用。

if len(s) > 0 { ... }

可以在strconv包中找到:http://golang.org/src/pkg/strconv/atoi.go

if s != "" { ... }

可以在encoding/json包中找到:http://golang.org/src/pkg/encoding/json/encode.go

两者都是惯用的,而且都足够清楚。这更多的是个人品味和清晰度的问题。

Russ Cox在golang-nuts的帖子中写道:

使代码清晰的那个。 如果我要查看元素x,我通常会写 len(s) >x,即使x == 0,但如果我关心 "是这个特定的字符串"我倾向于写s == "" 假设一个成熟的编译器会编译是合理的 Len (s) == 0和s == ""变成了同样高效的代码。 ... 使代码清晰。

正如Timmmm的回答所指出的,在这两种情况下,Go编译器确实生成了相同的代码。

其他回答

这两种样式都在Go的标准库中使用。

if len(s) > 0 { ... }

可以在strconv包中找到:http://golang.org/src/pkg/strconv/atoi.go

if s != "" { ... }

可以在encoding/json包中找到:http://golang.org/src/pkg/encoding/json/encode.go

两者都是惯用的,而且都足够清楚。这更多的是个人品味和清晰度的问题。

Russ Cox在golang-nuts的帖子中写道:

使代码清晰的那个。 如果我要查看元素x,我通常会写 len(s) >x,即使x == 0,但如果我关心 "是这个特定的字符串"我倾向于写s == "" 假设一个成熟的编译器会编译是合理的 Len (s) == 0和s == ""变成了同样高效的代码。 ... 使代码清晰。

正如Timmmm的回答所指出的,在这两种情况下,Go编译器确实生成了相同的代码。

假设空格和所有前导和后面的空格都应该被删除:

import "strings"
if len(strings.TrimSpace(s)) == 0 { ... }

因为: Len("") //为0 Len(" ") //一个空格为1 Len(" ") //两个空格为2

到目前为止,Go编译器在这两种情况下生成相同的代码,所以这是一个品味问题。GCCGo确实会生成不同的代码,但几乎没有人使用它,所以我不担心这个问题。

https://godbolt.org/z/fib1x1

根据官方的指导方针,从性能的角度来看,它们看起来是相等的(ANisus的答案),s != ""由于语法优势,将会更好。如果变量不是字符串,S != ""将在编译时失败,而len(S) == 0将通过其他几种数据类型。

这似乎是不成熟的微优化。编译器可以为这两种情况或至少为这两种情况生成相同的代码

if len(s) != 0 { ... }

and

if s != "" { ... }

因为语义显然是相等的。