Что является лучшим способом, чтобы проверить на пустую строку в Go?



какой метод лучше (более idomatic) для тестирования непустых строк (в Go)?



if len(mystring) > 0 { }


или:



if mystring != "" { }


или что-то еще?

803   6  

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 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

    Ничего не найдено.