Welche Methode ist am besten (mehr idomatic) zum Testen nicht leeren Strings (in Go)?Was ist der beste Weg, um eine leere Zeichenfolge in Go zu testen?
if len(mystring) > 0 { }
Oder:
if mystring != "" { }
Oder etwas anderes?
Welche Methode ist am besten (mehr idomatic) zum Testen nicht leeren Strings (in Go)?Was ist der beste Weg, um eine leere Zeichenfolge in Go zu testen?
if len(mystring) > 0 { }
Oder:
if mystring != "" { }
Oder etwas anderes?
Beide Stile sind in den Standardbibliotheken den Go verwendet. 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 idiomatische und und klar genug
if len(s) > 0 { ... }
kann im strconv
Paket. Es ist mehr eine Frage des persönlichen Geschmacks und der Klarheit.
Russ Cox schreibt in einem golang-nuts thread:
Derjenige, der Code deutlich macht.
Wenn ich im Begriff bin, Element x zu betrachten, schreibe ich normalerweise
len (s)> x, auch für x == 0, aber wenn ich mich interessiere "ist es diese spezifische Zeichenfolge" Ich neige dazu, s zu schreiben == "".Es ist vernünftig anzunehmen, dass ein ausgereiftes Compiler
len kompiliert (n) == 0 und s == "" in den gleichen, effizienten Code.
Gerade jetzt 6g etc kompilieren s == "" in einen Funktionsaufruf
während len (s) == 0 ist nicht, aber das zu beheben, auf meiner To-do-Liste gewesen ist.Machen Sie den Code klar.
Dies scheint verfrüht microoptimization zu sein. Der Compiler ist frei, die denselben Code für beide Fälle oder zumindest für diese beiden
if len(s) != 0 { ... }
und
if s != "" { ... }
zu produzieren, weil die Semantik eindeutig gleich ist.
Die Überprüfung auf Länge ist eine gute Antwort, aber Sie könnten auch eine "leere" Zeichenfolge angeben, die auch nur Leerzeichen enthält. Nicht „technisch“ leer, aber wenn Sie überprüfen Pflege:
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!")
}
}
Unter der Annahme, dass leere Räume und alle vorderen und hinteren weißen Leerzeichen entfernt werden sollen:
import "strings"
if len(strings.TrimSpace(s)) == 0 { ... }
Warum haben Sie diese Annahme? Der Typ erzählt deutlich von der leeren Saite. Auf die gleiche Weise können Sie feststellen, dass Sie nur ASCII-Zeichen in einer Zeichenfolge und dann eine Funktion hinzufügen möchten, die alle Nicht-ASCII-Zeichen entfernt. –
Weil len (""), len ("") und len ("") nicht dasselbe in go sind. Ich ging davon aus, dass er sicherstellen wollte, dass eine Variable, die er initialisiert hat, tatsächlich noch "technisch" leer ist. – Edwinner
Das ist eigentlich genau das, was ich von diesem Post brauchte. Ich brauche die Benutzereingabe, um mindestens 1 Nicht-Whitespace-Charakter zu haben, und dieser Einzeiler ist klar und prägnant. Alles, was ich tun muss, ist die if-Bedingung '<1' +1 – Shadoninja
Es sauberer sein würde und weniger fehler- anfällig unten eine Funktion wie die verwenden:
func empty(s string) bool {
return len(strings.TrimSpace(s)) == 0
}
ich mit dieser Antwort nicht einverstanden ist. Einfach 'wenn mystring!= "" {} 'ist der beste, bevorzugte und idiomatische Weg HEUTE. Der Grund dafür, dass die Standardbibliothek etwas anderes enthält, ist, dass sie vor 2010 geschrieben wurde, als die Optimierung "len (mystring) == 0" Sinn machte. – honzajde
@honzajde Ich habe gerade versucht, Ihre Aussage zu validieren, aber ich habe Commits in der Standardbibliothek gefunden, die weniger als 1 Jahr alt sind, indem Sie 'len' verwenden, um leere/nicht leere Strings zu prüfen. So [commit] (https://github.com/golang/go/commit/802cb5927f1e163749331c9f6cfb414cb0c753b9) von Brad Fitzpatrick. Ich fürchte, es ist immer noch eine Frage des Geschmacks und der Klarheit;) – ANisus
gibt es nur eine Instanz von _len_ Schlüsselwort in diesem Commit und das ist b/c iterieren über die Zeichenfolge, also bitte aufhören zu trollen ... – honzajde