Comment désactiver l'erreur d'importation non utilisée de Golang

98

Par défaut, Go traite l'importation inutilisée comme une erreur, vous obligeant à supprimer l'importation. Je veux savoir s'il existe un espoir de changer ce comportement, par exemple en le réduisant à un avertissement.

Je trouve ce problème extrêmement ennuyeux, m'empêchant de profiter du codage dans Go.

Par exemple, je testais du code, désactivant un segment / une fonction. Certaines fonctions d'une bibliothèque ne sont plus utilisées (par exemple, fmt, erreurs, peu importe), mais je devrai réactiver la fonction après un petit test. Maintenant, le programme ne se compilera pas à moins que je supprime ces importations, et quelques minutes plus tard, je dois réimporter la bibliothèque.

Je faisais ce processus encore et encore lors du développement d'un programme GAE.

pseudo
la source
1
Ce n'est pas une bonne idée de laisser les importations inutilisées dans votre code, mais vous pouvez simplement les commenter temporairement.
elithrar
72
Je suis d'accord que ce n'est pas une bonne idée de laisser des importations inutilisées, mais c'est une mauvaise idée de gaspiller inutilement les efforts du programmeur pour faire des choses comme celle-ci, en particulier cela se produit très souvent lors du test de quelque chose. Ces votes négatifs doivent être pour mon attitude envers GO par ces fans de Go.
Nick
6
C'est une fonctionnalité, pas un bug .
beatgammit
1
La suppression des importations inutilisées est une bonne chose. Il existe de nombreux guides de style qui exigent que tous les avertissements soient traités comme des erreurs, donc l'ajout d'un nouvel avertissement est généralement une mauvaise idée. Peut-être qu'un drapeau -dev pourrait être un compromis possible, mais cela var _ = <module>.Functionfonctionne bien et il est suffisamment visible pour éviter que ce soit une pratique courante.
deft_code
1
Comme quelqu'un en parle dans les réponses ci-dessous, je recommande soit d'utiliser un IDE qui gère les importations (Gogland, LiteIDE, etc. - il y en a plusieurs), soit d'en faire goimportsune étape dans votre processus de construction. Sans l'un ni l'autre, il vieillit très vite.
Josef Grahn

Réponses:

37

L'ajout d'un trait de soulignement ( _) avant un nom de package ignorera l'erreur d'importation inutilisée.

Voici un exemple de la façon dont vous pourriez l'utiliser:

import (
    "log"
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

Pour importer un package uniquement pour ses effets secondaires (initialisation), utilisez l'identifiant vide comme nom de package explicite.

En savoir plus sur https://golang.org/ref/spec#Import_declarations

Acide9
la source
C'est la bonne réponse. Basé sur la spécification GoLang Doc, il est destiné à être utilisé pour importer un package uniquement pour les effets secondaires (initialisation). GoLang Spec Doc ici: golang.org/ref/spec#Import_declarations
Will
Tout simplement fantastique. Cela devrait figurer dans une liste des dix principales choses que les nouveaux développeurs de Golang devraient savoir. Je vous remercie!
JM Janzen
11
Pas très utile. Le problème avec ceci est que si vous souhaitez utiliser à nouveau l'importation ultérieurement, vous devez supprimer le _(sinon le package ne peut pas être référencé, car il n'a pas de nom). Si vous voulez faire cela, vous pouvez tout aussi bien le commenter / décommenter. L' var _ = ...astuce n'a pas ce problème.
EM0
Si vous ajoutez le trait de soulignement "fmt"dans Gogland, il s'ajoute automatiquement "fmt"pour que vous ayez à la fois _"fmt"et "fmt", ce qui le rend inutile dans cet IDE
kramer65
26

L' var _ = fmt.Printfastuce est utile ici.

Volker
la source
J'adore cette solution. C'est assez moche pour le rendre indésirable, mais cela fonctionne donc c'est là si vous en avez vraiment besoin.
deft_code
3
Pour plus de détails, veuillez consulter ce lien tip.golang.org/doc/effective_go.html#blank_unused
Deepak Singh Rawat
3
C'est utile pour le moment, mais lorsque j'utilisais cette technique, j'avais tendance à ne pas revenir en arrière et à supprimer l'identifiant vierge inutilisé plus tard, ce qui faisait que les importations restaient lorsque je n'avais vraiment pas l'intention de les utiliser à long terme. L'utilisation d'un outil comme goimports a résolu le vrai problème et garantit que mes importations sont toujours minimes et propres.
mdwhatcott
Encore un hack stupide à mon avis, bien que probablement la chose la plus efficace à faire.
Anthony
+1 parce que cela peut être fait n'importe où dans le fichier , ce qui serait normalement une mauvaise idée mais est vraiment utile pour vous éviter d'avoir à sauter dans le fichier pour accéder à l' importinstruction et revenir lorsque vous essayez simplement de compiler ou de tester un fichier de code que vous étoffez de manière itérative .
mtraceur
22

J'ai le même problème. Je comprends le raisonnement pour lequel ils ont implémenté le langage pour interdire les importations et les variables inutilisées, mais je trouve personnellement cette fonctionnalité ennuyeuse lors de l'écriture de mon code. Pour contourner cela, j'ai changé mon compilateur pour autoriser des indicateurs facultatifs pour autoriser les variables inutilisées et les importations dans mon code.

Si vous êtes intéressé, vous pouvez le voir sur https://github.com/dtnewman/modified_golang_compiler .

Maintenant, je peux simplement exécuter du code avec une commande telle que go run -gcflags '-unused_pkgs' test.go et il ne lancera pas ces erreurs "importation non utilisée". Si je laisse de côté ces indicateurs, il revient à la valeur par défaut de ne pas autoriser les importations inutilisées.

Cela n'a nécessité que quelques changements simples. Les puristes de Go ne seront probablement pas satisfaits de ces changements car il y a de bonnes raisons de ne pas autoriser les variables / importations inutilisées, mais je suis personnellement d'accord avec vous que ce problème rend beaucoup moins agréable de coder dans Go, c'est pourquoi j'ai apporté ces modifications à mon compilateur.

dtzvi
la source
2
J'ai également fait la même chose avec la version 1.6, vérifiez ici si vous êtes intéressé: github.com/ronelliott/go/tree/release-branch.go1.6 REMARQUE: certains tests échoueront
Ron E
2
J'adore l'idée derrière ça. Je vois que votre fourchette est toujours à la version 1.2, ce qui la rend inutile. Cela devrait être inclus dans le compilateur go standard, au moins pour go run main.godésactiver les erreurs par défaut, tout en go buildactivant les erreurs. De cette façon, il est facile de développer en utilisant go runet quand il est temps de construire pour la production, vous êtes toujours obligé de nettoyer votre code.
kramer65
17

Utilisez goimports . C'est essentiellement un fork de gofmt, écrit par Brad Fitzpatrick et maintenant inclus dans les packages d'outils go. Vous pouvez configurer votre éditeur pour l'exécuter chaque fois que vous enregistrez un fichier. Vous n'aurez plus jamais à vous soucier de ce problème.

mdwhatcott
la source
5

Si vous utilisez le fmtpackage pour une impression générale sur la console pendant que vous développez et testez, vous pouvez trouver une meilleure solution dans le package de journaux .

VieuxCurmudgeon
la source
5
Ou la fonction intégrée printlnque les gens semblent toujours oublier.
MatrixFrog
2
@MatrixFrog À long terme, ce n'est pas une bonne idée de s'appuyer sur ces fonctions car elles peuvent disparaître avec le temps. L'utilisation du journal est une bonne idée car vous pouvez les conserver et il fait partie de la bibliothèque standard et il est peu probable qu'il soit supprimé. Voir les spécifications pour plus de détails.
nemo
1
Builtin println?? C'est une nouvelle pour moi. Est-ce sans papiers? Je ne peux le trouver nul part.
Matt
1
@nemo bon point. Ils sont parfaits lorsque vous avez besoin d'imprimer quelque chose en une seule fois, mais que vous n'avez pas l'intention de l'enregistrer. Probablement pas bon de les utiliser dans les autres cas.
MatrixFrog
1
@MartinTournoij - Je ne suis pas d'accord. C'est la solution que j'ai finalement trouvée lorsque j'ai eu ce problème il y a 5 ans et avec plus de 5 votes positifs, cela a clairement aidé les autres. J'étais un débutant utilisant le fmtpackage pour la journalisation, sans savoir qu'il y avait un package de journalisation prêt à l'emploi.
OldCurmudgeon
5

Utilisez if false { ... }pour commenter du code. Le code à l'intérieur des accolades doit être syntaxiquement correct, mais peut être un code absurde sinon.

topskip
la source
3
Plus que syntaxiquement correcte, toutes les variables référencées (par exemple foo.Bar) doivent exister, etc.
Dragon
Ce n'est pas très clair ou idiomatique. Il y a une raison pour laquelle Go a été conçu comme il était
Acidic9
1
C'est une technique intéressante quand on essaie simplement des choses tout en développant un script ou en explorant des API dans Golang. Merci topskip!
Jay Taylor
2

Beaucoup de gens ont déjà commenté avec une justification valable et je reconnais également l'intention de l'auteur original. Cependant, Rob Pike a mentionné dans différents forums que Go est le résultat de la simplification des processus qui manquent à quelques autres langages de programmation traditionnels ou qui ne sont pas faciles à réaliser. C'est la sémantique du langage de Go ainsi que pour accélérer la compilation, il y a beaucoup de choses qui sont adoptées qui semblent initialement inefficaces.

Pour faire court, les importations inutilisées sont considérées comme des erreurs dans Go car elles effacent le programme et ralentissent la compilation. L'utilisation de l'importation pour l'effet secondaire (_) est une solution de contournement, cependant, je trouve cela déroutant parfois lorsqu'il y a un mélange d'importations valides avec des effets secondaires ainsi que des effets secondaires importés uniquement à des fins de débogage / test, en particulier lorsque la base de code est grand et il y a une chance d'oublier et de ne pas supprimer involontairement, ce qui peut confondre d'autres ingénieurs / réviseurs plus tard. J'avais l'habitude de commenter ceux qui n'étaient pas utilisés, cependant, les IDE populaires tels que le code VS et Goland peuvent goimportsfacilement être utilisés, ce qui fait assez bien l'insertion et la suppression des importations. Veuillez vous référer au lien pour plus d'informations, https://golang.org/doc/effective_go.html#blank_import

sbcharr
la source
Merci pour cela! Je suggère explicitement de copier-coller la ligne de code de l'URL que vous avez publiée dans votre réponse comme exemple concret d'importation pour effet secondaire: import _ "net/http/pprof"
Dragon
1
Merci @Dragon pour votre suggestion! Puisque je suis un nouveau contributeur, avec l'aide de personnes comme vous, je vais rapidement m'améliorer avec mes publications.
sbcharr
-1

mettez ceci au-dessus de votre document et oubliez les importations inutilisées:

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
goen
la source
1
Au lieu de faire en sorte que le compilateur génère du code mort si vous vouliez vraiment faire cela, utilisez _plutôt des variables globales (par exemple, soit un paquet par ligne, soit si vous insistez, tous ensemble comme:) var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs. Mais ne faites pas cela, utilisez simplement goimports.
Dave C