web-dev-qa-db-fra.com

quelle est la différence entre fmt.Println () et println () in go

En route, si nous voulons imprimer quelque chose, nous pouvons le faire comme suit:

import "fmt"
func main(){
    fmt.Println("Hello world!")
}

Mais j'ai trouvé que l'on peut faire de même sans importer fmt:

func main(){
    println("Hello world!")
}

Quelqu'un pourrait-il expliquer?

101
YulCheney

println est une fonction intégrée (dans le runtime) qui peut éventuellement être supprimée, tandis que le package fmt est dans la bibliothèque standard, qui persistera. Voir la spécification sur ce sujet.

Pour les développeurs de langage, il est pratique d'avoir un println sans dépendances, mais la voie à suivre est d'utiliser le package fmt ou quelque chose de similaire (log par exemple).

Comme vous pouvez voir dans l'implémentation les fonctions print(ln) ne sont pas conçues pour prendre en charge à distance un mode de sortie différent et sont principalement un outil de débogage.

82
nemo

Pour tirer parti de la réponse de Nemo:

println est une fonction intégrée au langage. C'est dans la section Bootstrapping du spec . Depuis le lien:

Les implémentations actuelles fournissent plusieurs fonctions intégrées utiles lors du démarrage. Ces fonctions sont documentées pour être complètes mais ne sont pas garanties de rester dans la langue. Ils ne renvoient pas de résultat.

Function   Behavior

print      prints all arguments; formatting of arguments is implementation-specific
println    like print but prints spaces between arguments and a newline at the end

Ainsi, ils sont utiles aux développeurs, car ils manquent de dépendances (en cours de construction dans le compilateur), mais pas dans le code de production. Il est également important de noter que print et println relèvent de stderr, et non stdout.

Cependant, la famille fournie par fmt est conçue pour être en code de production. Ils relèvent de manière prévisible de stdout, sauf indication contraire. Ils sont plus polyvalents (fmt.Fprint* peut signaler à n'importe quel io.Writer, tel que os.Stdout, os.Stderr, ou même un net.Conn type.) et ne sont pas spécifiques à l'implémentation.

La plupart des packages responsables de la sortie ont fmt comme dépendance, comme log. Si votre programme va produire quoi que ce soit en production, fmt est très probablement le package que vous souhaitez.

98
Alexander Bauer

Quant à la différence, this est un exemple.

println() imprime un pointeur sur l'adresse du test de fonction.

fmt.Println() imprime l'adresse de la fonction.

1
Steven