477 Stimmen

Was ist der beste Weg, um in Go auf einen leeren String zu testen?

Welche Methode ist am besten (am idiomatischsten) für das Testen von nicht leeren Zeichenketten (in Go)?

if len(mystring) > 0 { }

Oder:

if mystring != "" { }

Oder etwas anderes?

690voto

ANisus Punkte 69782

Beide Stile werden innerhalb der Standardbibliotheken von Go verwendet.

if len(s) > 0 { ... }

kann im strconv Paket gefunden werden: http://golang.org/src/pkg/strconv/atoi.go

if s != "" { ... }

kann im encoding/json Paket gefunden werden: http://golang.org/src/pkg/encoding/json/encode.go

Beide sind idiomatisch und klar genug. Es ist eher eine Frage des persönlichen Geschmacks und der Klarheit.

Russ Cox schreibt in einem golang-nuts Thread:

Derjenige, der den Code klar macht.
Wenn ich vorhabe, ein Element x anzuschauen, schreibe ich normalerweise
len(s) > x, auch für x == 0, aber wenn es mir um
"ist es dieser spezifische String" geht, tendiere ich dazu s == "".

Es ist vernünftig anzunehmen, dass ein ausgereifter Compiler
len(s) == 0 und s == "" in denselben, effizienten Code kompiliert.
...

Mache den Code klar.

Wie in Timmmms Antwort hervorgehoben wurde, generiert der Go-Compiler in beiden Fällen identischen Code.

46voto

zzzz Punkte 83651

Dies scheint eine vorzeitige Mikrooptimierung zu sein. Der Compiler ist frei, den gleichen Code für beide Fälle oder zumindest für diese beiden zu erzeugen

if len(s) != 0 { ... }

und

if s != "" { ... }

denn die Semantik ist eindeutig gleich.

42voto

Edwinner Punkte 1984

Unter der Annahme, dass leere Leerzeichen sowie alle führenden und abschließenden Leerzeichen entfernt werden sollen:

import "strings"
if len(strings.TrimSpace(s)) == 0 { ... }

Da :
len("") // ist 0
len(" ") // ein Leerzeichen ist 1
len(" ") // zwei Leerzeichen sind 2

28voto

Wilhelm Murdoch Punkte 1796

Das Überprüfen der Länge ist eine gute Antwort, aber Sie könnten auch auf einen "leeren" String achten, der nur Leerzeichen enthält. Nicht "technisch" leer, aber wenn Sie darauf achten möchten:

package main

import (
  "fmt"
  "strings"
)

func main() {
  stringOne := "merpflakes"
  stringTwo := "   "
  stringThree := ""

  if len(strings.TrimSpace(stringOne)) == 0 {
    fmt.Println("String ist leer!")
  }

  if len(strings.TrimSpace(stringTwo)) == 0 {
    fmt.Println("String zwei ist leer!")
  }

  if len(stringTwo) == 0 {
    fmt.Println("String zwei ist immer noch leer!")
  }

  if len(strings.TrimSpace(stringThree)) == 0 {
    fmt.Println("String drei ist leer!")
  }
}

18voto

Timmmm Punkte 76756

Bis jetzt generiert der Go-Compiler in beiden Fällen identischen Code, daher ist es eine Geschmacksfrage. GCCGo generiert jedoch unterschiedlichen Code, aber fast niemand verwendet es, also würde ich mir darüber keine Sorgen machen.

https://godbolt.org/z/fib1x1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X