2013-09-03 4 views

Répondre

188

Les deux styles sont utilisés dans les bibliothèques standard de Go.

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

se trouvent dans le paquet strconv: http://golang.org/src/pkg/strconv/atoi.go

if s != "" { ... } 

se trouvent dans le paquet encoding/json: http://golang.org/src/pkg/encoding/json/encode.go

Les deux sont idiomatiques et et assez claire. C'est plus une question de goût personnel et de clarté.

Russ Cox écrit dans un golang-nuts thread:

Celui qui rend le code clair.
Si je suis sur le point de regarder l'élément x généralement j'écris
len (s)> x, même pour x == 0, mais si je me soucie de
"est-ce cette chaîne spécifique" J'ai tendance à écrire s == "".

Il est raisonnable de supposer qu'un compilateur mature compilera
len (s) == 0 et s == "" dans le même code efficace.
En ce moment, 6g etc compile s == "" dans un appel de fonction
alors que len (s) == 0 ne l'est pas, mais cela a été sur ma liste de tâches à corriger.

Effacer le code.

+0

Je ne suis pas d'accord avec cette réponse. Simplement 'si mystring!= "" {} 'est la meilleure façon, préférée et idiomatique AUJOURD'HUI. La raison que la bibliothèque standard contient autrement est parce qu'elle a été écrite avant 2010 quand l'optimisation 'len (mystring) == 0' avait du sens. – honzajde

+1

@honzajde J'ai juste essayé de valider votre instruction, mais j'ai trouvé des commits dans la bibliothèque standard de moins d'un an en utilisant 'len' pour vérifier les chaînes vides/non vides. Comme ceci [comm.] (Https://github.com/golang/go/commit/802cb5927f1e163749331c9f6cfb414cb0c753b9) par Brad Fitzpatrick. Je crains que ce soit encore une question de goût et de clarté;) – ANisus

+0

il n'y a qu'une seule instance de _len_ mot-clé dans ce commit et c'est b/c iterating sur la chaîne, donc arrêtez de troller ... – honzajde

17

Cela semble être une microoptimisation prématurée. Le compilateur est libre de produire le même code pour les deux cas, ou au moins pour ces deux

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

et

if s != "" { ... } 

parce que la sémantique est bien égal.

11

La vérification de la longueur est une bonne réponse, mais vous pouvez également prendre en compte une chaîne "vide" qui est également uniquement un espace. Non « techniquement » vide, mais si vous tenez à vérifier:

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!") 
    } 
} 
2

En supposant que les espaces vides et tous les avant et arrière espaces blancs doivent être enlevés:

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

Pourquoi avez-vous cette hypothèse? Le gars parle clairement de la chaîne vide. De la même manière que vous pouvez le dire, en supposant que vous ne voulez que des caractères ascii dans une chaîne, puis ajoutez une fonction qui supprime tous les caractères non-ascii. –

+0

Parce que len (""), len ("") et len ​​("") ne sont pas la même chose dans go. Je supposais qu'il voulait s'assurer qu'une variable qu'il avait initialisée à l'un de ceux-ci était en réalité "techniquement" vide. – Edwinner

+0

C'est exactement ce dont j'avais besoin de ce post. J'ai besoin de l'entrée de l'utilisateur pour avoir au moins 1 caractère non-espace et ce one-liner est clair et concis. Tout ce que j'ai à faire est de faire la condition if <<1' +1 – Shadoninja

0

Il serait plus propre et moins ERROR- enclins à utiliser une fonction comme celle-ci:

func empty(s string) bool { 
    return len(strings.TrimSpace(s)) == 0 
} 
Questions connexes