[GO language] Organisez le comportement de l'importation dans des endroits autres que GOPATH

Je suis souvent accro lors de l'importation dans un endroit autre que $ GOPATH. C'est parce qu'il existe les modèles suivants.

Pour chacun d'entre eux, déterminez en quoi l'importation est différente. (La version GO est supposée être 1.14)

Résumé approximatif

Quand j'écris les grandes lignes de la conclusion, cela ressemble à ce qui suit

introduction

environnement

Basculer entre le mode GOPATH et le mode module

Mode GOPATH et changement de mode module en fonction de la présence ou de l'absence du fichier go.mod

Importation de package externe

Import de packages externes en mode GOPATH

Structure du répertoire

.
└── main.go

main.go

package main

import (
	"fmt"
	"github.com/antonholmquist/jason" //Importer des packages externes
)

func main() {
	v, _ := jason.NewObjectFromBytes([]byte(`{"Name": "fetaro"}`))
	fmt.Println(v)
}

Où allez-vous chercher?

$GOPATH/src/

Plus précisément, $ GOPATH / src / github.com / antonholmquist / jason

Et s'il n'y a pas de package ici

Erreur impossible de trouver le package

main.go:5:2: cannot find package "github.com/antonholmquist/jason" in any of:
	/usr/local/Cellar/go/1.14.3/libexec/src/github.com/antonholmquist/jason (from $GOROOT)
	/Users/tetsutaro.watanabe/go/src/github.com/antonholmquist/jason (from $GOPATH)

Comment placer le colis?

go get

Plus précisément, allez chercher github.com / antonholmquist / jason

Import de packages externes en mode module

Structure du répertoire

.
├── go.mod ←go.Depuis que j'ai mis le fichier mod, il passe en mode module
└── main.go

main.go

package main

import (
	"fmt"
	"github.com/antonholmquist/jason" //Importer des packages externes
)

func main() {
	v, _ := jason.NewObjectFromBytes([]byte(`{"Name": "fetaro"}`))
	fmt.Println(v)
}

go.mod

module hoge

go 1.14

Où allez-vous chercher?

$GOPATH/pkg/mod

Plus précisément, /Users/tetsutaro.watanabe/go/pkg/mod/github.com/antonholmquist/jason \ @ v1.0.0 /

Et s'il n'y a pas de package ici

Il sera téléchargé sans autorisation.

Si vous faites aller exécuter main.go alors qu'il n'a pas encore été téléchargé, il sera téléchargé puis exécuté comme indiqué ci-dessous.

$ go run main.go
go: finding module for package github.com/antonholmquist/jason
go: found github.com/antonholmquist/jason in github.com/antonholmquist/jason v1.0.0 ← Télécharger le résultat
{"Name":"fetaro"}← Résultat de l'exécution

Une fois téléchargé, go.mod sera réécrit

Réécrit «go.mod»

module hoge

go 1.14

require github.com/antonholmquist/jason v1.0.0 // indirect

Importation de package interne

Importer des packages internes en mode GOPATH

Structure du répertoire

.
├── main.go
└── mypkg ← Paquet interne
    └── bar.go

main.go

package main

import (
	"./mypkg" //Importer des packages internes
)

func main() {
	mypkg.PrintBar()
}

bar.go

package mypkg

import "fmt"

func PrintBar(){
	fmt.Println("bar")
}

Où aller chercher

. / mypkg avec un chemin relatif depuis main.go

Et s'il n'y a pas de package ici

Erreur impossible de trouver le package

main.go:4:2: cannot find package "." in:
	/Users/tetsutaro.watanabe/git/golab3/mypkg

Importer des packages internes en mode module

Structure du répertoire

.
├── go.mod ←go.Mode module car il y a un mod
├── main.go
└── mypkg ← Bibliothèque interne
    └── bar.go

main.go

package main

import (
	"mymodule/mypkg" //← allez ici.Nom du module écrit en mod+Faites-en un nom de package
)

func main() {
	mypkg.PrintBar()
}

go.mod

module mymodule

go 1.14

bar.go

package mypkg

import "fmt"

func PrintBar(){
	fmt.Println("bar")
}

Où aller chercher

C'est difficile. En mode module, le "" mymodule / mypkg "" spécifié dans l'importation est une concaténation d'un module et d'un package.

Plus précisément, vous rechercherez (nom du module décrit dans go.mod) + (chemin relatif du package à partir de l'emplacement de go.mod).

Dans cet exemple, mymodule est le module et / mypkg est le chemin relatif du répertoire contenant" go.mod with module mymodule ".

Et s'il n'y a pas de package ici

Obtenez une erreur

main.go:4:2: package mymodule/mypkg is not in GOROOT (/usr/local/Cellar/go/1.14.3/libexec/src/mymodule/mypkg)

Expérimentation des endroits où chercher 1

Cas où go.mod est supérieur à main.go

Par exemple, dans le cas de la structure de répertoires suivante

.
├── c_pkg
│   ├── d_pkg
│   │   └── bar.go
│   └── main.go
└── go.mod

Si vous spécifiez module a_module / b_module dans go.mod, Dans main.go, il peut être lu avec import" a_module / b_module / c_pkg / d_pkg "

Expérimentation d'endroits où aller chercher 2

Cmd commune et configurations internes

.
├── cmd
│   └── main.go
├── go.mod
└── internal
    └── lib.go

go.mod

module github.com/fetaro/my_module

go 1.14

main.go

package main

import (
    "github.com/fetaro/my_module/internal"
)

func main() {
    internal.PrintHoge()
}

lib.go

package internal

import "fmt"

func PrintHoge(){
    fmt.Println("hoge")
}

Recommended Posts

[GO language] Organisez le comportement de l'importation dans des endroits autres que GOPATH
Vérifiez le comportement du destroyer en Python
Différences de comportement de chaque langage LL lorsque l'index de la liste est ignoré
Un expert Ruby a appris la grammaire de base du langage Go
À propos de l'ordre épuré dans l'ordre d'importation flake8
Caractéristiques du langage Go
Remarque sur le comportement par défaut de collate_fn dans PyTorch
[Note] Importation de fichiers dans le répertoire parent en Python
Hello World en langue GO
Organiser des blogs utiles dans le domaine de la science des données (outre-mer et Japon)
L'histoire selon laquelle le comportement d'héritage est assez différent dans chaque langue
Créez une fonction pour obtenir le contenu de la base de données dans Go