Каков наилучший способ проверить пустую строку в 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
}