由于空字符串是字符串的 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 语句中使用三种不同的检查:str == ""、len(str) == 0 和 len(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"),没有可测量的差异。检查非空字符串需要更多时间,而且 nil 检查明显更快。
BenchmarkLenEq-8 2000000000 0.34 ns/op
BenchmarkLenLess-8 2000000000 0.33 ns/op
BenchmarkNil-8 2000000000 0.33 ns/op
EDIT2:
这些天来,你唯一能做的就是对它进行基准测试。现代 CPU 是超标量的,因此每条指令一个时钟周期根本不再适用。与空字符串进行比较的基准代码在我的 4GHz 6700k 上以 2.94GHz (2.94*10^9 op/s) 运行,每次循环迭代少于两个时钟周期。针对非空字符串的 nil 检查在同一 CPU 上以 2GHz (2*10^9 op/s) 运行。
这意味着在 nil 检查时每次循环迭代需要 2 个 cpu 周期,在 len 检查上需要 3 个 CPU 周期,或者在针对空字符串检查时每次循环迭代需要一条指令。