Поскольку пустая строка является нулевым значением строки, вы должны сравнить ее.
str == ""
Проверка переменных на их нулевые значения, чтобы увидеть, пусты ли они, — это способ Go сделать это.
С точки зрения производительности особой разницы нет. Использование len(str)
— это вызов функции, поэтому теоретически он должен работать медленнее.
EDIT: некоторые доказательства:
Я сравнил этот код:
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: Единственное, что вы можете сделать в эти дни, чтобы быть в некоторой степени уверенным в том, насколько быстро что-то работает, — это сравнить его. Современные ЦП являются суперскалярными, поэтому один такт на инструкцию просто больше не соответствует действительности. Тестовый код, сравниваемый с пустой строкой, работал на частоте 2,94 ГГц (2,94 * 10 ^ 9 операций в секунду) на моем 4 ГГц 6700k, что составляет менее двух тактовых циклов на итерацию цикла. Нулевая проверка непустой строки выполнялась на частоте 2 ГГц (2*10^9 операций в секунду) на том же процессоре.
Это означает 2 такта ЦП на итерацию цикла при проверке на nil и 3 на проверку длины, или одну инструкцию на итерацию цикла при проверке на пустую строку.
person
Filip Haglund
schedule
17.01.2016
str == ""
, а неlen(str) != ""
(последнее - синтаксическая ошибка) - person Filip Haglund   schedule 17.01.2016