len(字符串) == 0 或 len(字符串) < 1

len(string) == 0 or len(string) < 1

Go 中,要检查字符串是否为空,可以使用:

len(str) == 0

len(str) < 1

str == ""

基本上只是选择运算符的一个指标==<!=,但在性能方面希望选项更好?

我的猜测是 == 只是比较而不是像 < 那样遍历值,或者 <== 可以这样做,因此想知道什么是最好的方法实践.

由于空字符串是字符串的 nil 值,您应该与它进行比较。

str == ""

根据它们的 nil 值检查变量以查看它们是否为空是执行此操作的 Go 方法。

就性能而言,没有显着差异。使用 len(str) 是一个函数调用,所以理论上它应该更慢。

编辑:一些证据:

我对这段代码进行了基准测试:

func BenchmarkNil(b *testing.B) {
    str := "asd"
    cnt := 0
    for i := 0; i < b.N; i++ {
        if str == "" {
            cnt++
        }
    }
}

使用 if-statement 中的三种不同检查:str == ""len(str) == 0len(str) < 1

BenchmarkLenEq-8        2000000000               0.77 ns/op
BenchmarkLenLess-8      2000000000               0.76 ns/op
BenchmarkNil-8          2000000000               0.50 ns/op

对于空字符串检查(str := "" 而不是 str := "asd"),没有可测量的差异。检查 non-empty 字符串需要更多时间,而 nil 检查速度明显更快。

BenchmarkLenEq-8        2000000000               0.34 ns/op
BenchmarkLenLess-8      2000000000               0.33 ns/op
BenchmarkNil-8          2000000000               0.33 ns/op

编辑2: 这些天你唯一能做的就是对它进行基准测试来确定它有多快。现代 CPU 是超标量的,因此每条指令一个时钟周期不再适用。基准代码与我的 4GHz 6700k 上 2.94GHz (2.94*10^9 op/s) 的空字符串 运行 进行比较,每次循环迭代少于两个时钟周期。在同一个 CPU 上以 2GHz (2*10^9 op/s) 对 non-empty 字符串 运行 进行 nil 检查。

这意味着在 nil 检查时每个循环迭代 2 cpu 个周期,在 len 检查时 3 个周期,或者在检查空字符串时每个循环迭代一个指令。

如果你检查X86 Assembly control flows,你会看到有相等跳转和不等式跳转指令。所以理论上,如果你对 Go 编译器做出一些简单的假设,!=< 将执行相同的操作(1 CPU 时钟)。

如果你真的喜欢它,你可以看看 this answer 并比较它们各自生成的程序集。