6 ответов:
оба стиля используются в стандартных библиотеках Go.
if len(s) > 0 { ... }можно найти в
strconvпакет:http://golang.org/src/pkg/strconv/atoi.goif 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 etc компилируют 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 }
Comments