Каков наилучший способ проверить пустую строку в Go?
какой метод лучше (более idomatic) для тестирования непустых строк (в Go)?
if len(mystring) > 0 { }
или:
if mystring != "" { }
или что-то еще?
6 ответов
оба стиля используются в стандартных библиотеках 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
оба являются идиоматическими и достаточно ясными. Это скорее вопрос личного вкуса и ясности.
Расс Кокс пишет в golang-орехи нить:
тот, который делает код понятным.
Если я собираюсь посмотреть на элемент x, я обычно пишу
len (s) > x, даже для x == 0, но если я забочусь о
"это конкретная строка" я склонен писать s =="".разумно предположить, что зрелый компилятор будет компилировать
len (s) == 0 и s == "" в один и тот же эффективный код.
Прямо сейчас 6g и т. д. компилируют s == "" в вызов функции
в то время как len(s) == 0 нет, но это было в моем списке дел, чтобы исправить.сделать код понятным.
это кажется преждевременной микрооптимизацией. Компилятор может создавать один и тот же код для обоих случаев или, по крайней мере, для этих двух
if len(s) != 0 { ... }
и
if s != "" { ... }
потому что семантика явно равны.
проверка длины-хороший ответ, но вы также можете учитывать "пустую" строку, которая также является только пробелом. Не "технически" пусто, но если вы хотите проверить:
package main
import (
"fmt"
"strings"
)
func main() {
stringOne := "merpflakes"
stringTwo := " "
stringThree := ""
if len(strings.TrimSpace(stringOne)) == 0 {
fmt.Println("String is empty!")
}
if len(strings.TrimSpace(stringTwo)) == 0 {
fmt.Println("String two is empty!")
}
if len(stringTwo) == 0 {
fmt.Println("String two is still empty!")
}
if len(strings.TrimSpace(stringThree)) == 0 {
fmt.Println("String three is empty!")
}
}
предполагая, что пустые пробелы и все ведущие и конечные пробелы должны быть удалены:
import "strings"
if len(strings.TrimSpace(s)) == 0 { ... }
было бы чище и менее подвержено ошибкам использовать функцию, подобную приведенной ниже:
func empty(s string) bool {
return len(strings.TrimSpace(s)) == 0
}
Это было бы более эффективно, чем обрезка всей строки, так как вам нужно только проверить наличие хотя бы одного символа без пробела
// Strempty checks whether string contains only whitespace or not
func Strempty(s string) bool {
if len(s) == 0 {
return true
}
r := []rune(s)
l := len(r)
for l > 0 {
l--
if !unicode.IsSpace(r[l]) {
return false
}
}
return true
}