Allons-y Organisation du code de Golang

Go est une langue spéciale parmi les langues modernes. C'est très avisé. Par exemple, il y a un vrai formatage. Go vous indiquera comment espacer votre code et où placer vos accolades. Mais ça va beaucoup plus loin que ça. 

Go vous indiquera également comment capitaliser vos fonctions et variables pour les rendre publiques ou privées. Cela dictera la structure de répertoires de votre code. Cela peut surprendre les développeurs qui utilisent Go, à partir de langages de programmation plus libéraux.. 

Dans cet article, je vais explorer certaines des restrictions de Go, discuter de leurs avantages et suggérer des options pour des situations courantes..

Go est un langage de programmation incroyablement puissant. Vous y apprendrez tout, de l'écriture de simples utilitaires à la construction de serveurs Web évolutifs et flexibles dans notre cours complet..

Projet Euler

Lorsque j'ai commencé à apprendre Go, j'ai créé une solution au problème n ° 6 et je l'ai simplement placée dans un sous-répertoire, à côté des solutions à d'autres problèmes dans d'autres langues. Voir le projet Euler.

Le problème est que Go ne veut pas que vous dispersiez simplement des fichiers Go de manière aléatoire. J'ai par la suite réalisé que, même si cela fonctionne dans des cas très simples où vous n'importez pas d'autres paquets, ce n'est pas correct..

Les dépendances

Chaque programme non trivial est composé de plusieurs fichiers, modules, composants ou classes. Je vais juste utiliser "fichier" comme terme général. Ils sont souvent regroupés dans des bibliothèques, des packages ou des assemblys. Je vais juste utiliser "paquet" comme terme général. Le code que vous écrivez dépend du code des autres fichiers et packages.. 

Vous devez indiquer à votre code comment trouver ces packages et fichiers pour pouvoir utiliser leurs fonctionnalités. Chaque langue a son propre terme: import, include, require. Je vais juste utiliser "import" comme terme général.

Certaines langues (ou outils spécifiques à une langue) vous permettent également d’installer des dépendances à partir d’un référentiel de paquets distant et de les installer dans un emplacement local standard à partir duquel vous pouvez importer des données..

Dans la plupart des langages de programmation courants, vous avez beaucoup de liberté. En C / C ++, vous indiquez au compilateur / à l'éditeur de liens où se trouvent les fichiers et les bibliothèques statiques (à l'aide de commutateurs de ligne de commande ou de variables d'environnement telles que INCLUDE_DIR). En Python, vous pouvez installer des packages à partir de PyPI à l’aide de setup.py ou à l’aide de pip à partir de PyPI et de référentiels de contrôle de sources distantes. Vous importez ensuite en fonction du chemin de recherche du package sys.path.

La voie aller

Go, comme toujours, est plus normatif. Cela peut heurter votre créativité de ne pas savoir autant où placer les choses, mais au bout du compte, cela n'a pas vraiment d'importance et il y a suffisamment de souplesse pour s'adapter à diverses situations..

Go nécessite que vous mettiez votre code dans un espace de travail. Un espace de travail est simplement un répertoire avec trois sous-répertoires: src, pkg et bin. Il est recommandé de conserver tous vos projets dans un seul espace de travail. De cette façon, ils peuvent compter les uns sur les autres et partager des packages tiers communs.

Remarque: Je travaille actuellement sur Windows et utilise PowerShell pour la plupart des exemples interactifs. Pour la section suivante, je voulais montrer la structure de répertoire de mon espace de travail en utilisant le arbre commander. Windows a sa propre commande tree.exe, mais elle est très limitée (pas de niveaux). Il y aurait une commande d'arborescence à part entière pour Windows ici

Mais le site était inaccessible. J'ai fini par lancer un conteneur Docker exécutant Ubuntu, monter mon espace de travail Go sous le nom / docs / Go et utiliser la commande d'arborescence Linux pour l'afficher. Ne vous y trompez donc pas si vous voyez un environnement Linux affichant des répertoires Windows et des fichiers avec le suffixe .exe.

Voici mon espace de travail actuel Go. le poubelle Le répertoire contient diverses commandes / outils Go, ainsi que le débogueur Delve. le pkg dir a un sous-répertoire avec la plate-forme (Win 64) qui contient les paquetages organisés par leur origine (github.com, golang.com, etc.). le src le répertoire contient des sous-répertoires similaires pour le référentiel d'origine ou le site Web (github.com, golang.org, etc.).

root @ 67bd4824f9d5: / docs / Go # arbre -n -L 3 | - bin | | - dlv.exe | | - go-outline.exe | | - go-symboles.exe | | - gocode.exe | | - godef.exe | | - golint.exe | | - gometalinter.exe | | - gopkgs.exe | | - gorename.exe | | - goreturns.exe | '- guru.exe | - pkg | '- windows_amd64 | | - github.com | | - golang.org | | - gopkg.in | '- sourcegraph.com' - src | - github.com | | - alecthomas | | - derekparker | | - go-web-crawler | | - golang | | - google | | - lukehoban | | - multi-git | | - newhook | | - nsf | | - rogpeppe | | - tpng | '- x | - golang.org | '- x | - gopkg.in | '- alecthomas' - sourcegraph.com '- 27 répertoires sqs, 11 fichiers 

Jetons un coup d'oeil à l'intérieur d'un des projets source que j'ai créé sous src: le go-web-crawler. C'est assez simple ici: juste une liste plate de fichiers Go, une licence et un fichier README.

root @ 67bd4824f9d5: / docs / Go # arbre src / github.com / go-web-robot / /n src / github.com / go-web-robot / | - LICENCE | - LISEZMOI.md | - channel_crawl .go | - main.go '- sync_map_crawl.go 0 répertoires, 5 fichiers

GOROOT et GOPATH

Deux variables d'environnement contrôlent votre destin au pays de Go. GOROOT est l'emplacement d'installation de Go:

09:21:26 C: \ Utilisateurs \ the_g \ Documents \ Go> ls Env: \ Nom GOROOT Valeur ---- ----- GOROOT C: \ Go \ 09:21:35 C: \ Utilisateurs \ the_g \ Documents \ Go> ls c: \ go Répertoire: C: \ go Mode LastWriteTime Longueur Nom ---- ------------- ------ ---- d --- - 16/08/2016 10h38 api d ----- 16/08/2016 10h38 bin d ----- 16/08/2016 10:38 blog d ----- 16/08/2016 10h38 doc d ----- 16/08/2016 10h38 lib d ----- 16/08/2016 10h38 misc d ----- 8 / 16/2016 10h38 pkg d ----- 16/08/2016 10h38 src d ----- 16/08/2016 10h38 test -a ---- 8/16 / 2016 13h48 29041 AUTEURS -a ---- 16/08/2016 13h48 1168 CONTRIBUER -a ---- 16/08/2016 13h48 40192 CONTRIBUER -a ---- 8/16 / 2016 13h48 1150 favicon.i -a ---- 16/08/2016 13h48 1479 LICENCE -a ---- 16/08/2016 13h48 1330 BREVETS -a ---- 16/08/2016 13h48 1638 README.md -a ---- 16/08/2016 13h48 26 robots.tx -a ---- 16/08/2016 13h48 5 VERSION 

Notez que le répertoire racine Go ressemble à un sur-ensemble d'un espace de travail contenant les répertoires src, bin et pkg..

GOPATH pointe vers votre espace de travail. Voilà comment Go trouve votre code.

09:21:53 C: \ Utilisateurs \ the_g \ Documents \ Go> ls Env: \ Nom GOPATH ---- ----- GOPATH c: \ Utilisateurs \ the_g \ Documents \ Go 

Il existe de nombreuses autres variables d’environnement liées à Go, que vous deviez définir par le passé (par exemple,. GOOS et GOARCH). Désormais, ils sont facultatifs et vous ne devriez pas les déranger à moins d’en avoir vraiment besoin (par exemple lors d’une compilation croisée). Pour voir toutes les variables d'environnement Go, tapez: aller env.

09:51:10 C: \ Users \ the_g> go env set GOARCH = amd64 set GOBIN = set GOEXE = .exe set GOHOSTARCH = amd64 set GOHOSTOS = windows set GOOS = fenêtres set GOPATH = c: \ Utilisateurs \ the_g \ Documents \ Définir GORACE = définir GOROOT = C: \ Définir GOTOOLDIR = C: \ Aller \ pkg \ tool \ windows_amd64 définir CC = gcc définir GOGCCFLAGS = -m64 -mthreads -fmessage-length = 0 définir CXX = g ++ définir CGO_ENABLED = 1

Installations et importations

Lorsque vous créez un programme Go ou une bibliothèque, vous pouvez l'installer. Les programmes vont dans votre espace de travail poubelle répertoire, et les bibliothèques vont à l'espace de travail pkg annuaire. Sur Windows, j'ai découvert que votre % GOPATH% / bin n'est pas dans le %CHEMIN% répertoire pour que Windows ne puisse pas trouver mon exécutable. Je l'ai ajouté à Windows PATH et tout a fonctionné. Voici comment vérifier dans PowerShell que votre PATH contient le répertoire bin de votre espace de travail:

10:56:19 C: \ Utilisateurs \ the_g> $ env: path.split (";") | grep go C: \ Go \ bin c: \ Utilisateurs \ the_g \ Documents \ Go \ bin 

Voyons tout cela en action.

Si je vais dans mon répertoire go-web-crawler et que je tape aller installer puis go-web-crawler.exe est créé dans c: \ Utilisateurs \ the_g \ Documents \ Go \ bin:

11:09:18 C: \ Utilisateurs \ the_g> ls $ env: GOPATH / bin Répertoire: C: \ Utilisateurs \ the_g \ Documents \ Go \ bin Mode LastWriteTime Longueur Nom ---- --------- ---- ------ ---- -a ---- 15/08/2016 11:05 15891456 dlv.exe -a ---- 15/08/2016 10:08 3972608 go -outline.exe -a ---- 15/08/2016 10:10 4502528 go-symbol.exe -a ---- 18/09/2016 10:14 1849856 go-web-crawler.exe -a ---- 15/08/2016 10:08 12097024 gocode.exe -a ---- 15/08/2016 10:17 6642688 godef.exe -a ---- 15/08/2016 9:32 AM 6625792 golint.exe -a ---- 15/08/2016 10:14 AM 6352896 gometalinter.exe -a ---- 15/08/2016 10:10 AM 2738688 gopkgs.exe -a ---- 8 / 15/2016 10:10 6961152 gorename.exe -a ---- 15/08/2016 10:09 7291904 goreturns.exe -a ---- 15/08/2016 10:11 9722368 guru.exe 

Je peux maintenant l'exécuter à partir de mon robot d'exploration Web Go de n'importe où.

11:10:32 C: \ Users \ the_g> go-web-crawler.exe trouvé: http://golang.org/ "Le langage de programmation Go" trouvé: http://golang.org/cmd/ "" not trouvé: http://golang.org/cmd/ trouvé: http://golang.org/pkg/ "Packages" trouvé: http://golang.org/pkg/os/ "Package os" trouvé: http: / /golang.org/pkg/fmt/ "Package fmt" trouvé à l'adresse suivante: http://golang.org/ "Le langage de programmation Go"

Environnements multiples

Tout va bien, mais parfois la vie n'est pas si simple. Vous souhaiterez peut-être avoir plusieurs espaces de travail distincts. De plus, vous souhaiterez peut-être avoir plusieurs installations de Go (différentes versions, par exemple) et plusieurs espaces de travail pour chacun. Vous pouvez le faire en définissant dynamiquement GOPATH pour changer l'espace de travail et le réglage GOROOT pour changer l'installation active de Go.

Il existe divers projets open-source pour la vente, la gestion de paquets et les environnements virtuels. Pour une raison quelconque, la plupart ne supporte pas Windows. Je ne sais pas pourquoi ces outils doivent être spécifiques à une plate-forme. J'écrirai moi-même un de ces gestionnaires multi-plateformes de l'environnement Go.

Conclusion

Go est tout au sujet d'éliminer la complexité accidentelle. Parfois, cela se révèle très strict et normatif. Mais si vous entrez dans l’esprit des concepteurs de Go, vous commencez à comprendre que le fait d’éviter, d’interdire ou d’imposer certaines choses simplifie vraiment les choses..