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)
Quand j'écris les grandes lignes de la conclusion, cela ressemble à ce qui suit
$ GOPATH / src
$ GOPATH / pkg / mod
Mode GOPATH et changement de mode module en fonction de la présence ou de l'absence du fichier go.mod
go.mod
manquantgo.mod
(** Il est valide même s'il y a go.mod dans la hiérarchie au-dessus du répertoire à exécuter **)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)
}
$GOPATH/src/
Plus précisément, $ GOPATH / src / github.com / antonholmquist / jason
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)
go get
Plus précisément, allez chercher github.com / antonholmquist / jason
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
$GOPATH/pkg/mod
Plus précisément, /Users/tetsutaro.watanabe/go/pkg/mod/github.com/antonholmquist/jason \ @ v1.0.0 /
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
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")
}
. / mypkg
avec un chemin relatif depuis main.go
Erreur impossible de trouver le package
main.go:4:2: cannot find package "." in:
/Users/tetsutaro.watanabe/git/golab3/mypkg
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")
}
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 ".
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)
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 "
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