Ich bin oft begeistert, wenn ich an einen anderen Ort als "$ GOPATH" importiere. Das liegt daran, dass es die folgenden Muster gibt.
Sortieren Sie für jedes dieser Elemente, wie unterschiedlich der Import ist. (GO-Version wird als 1.14 angenommen)
Wenn ich den Umriss der Schlussfolgerung schreibe, sieht es wie folgt aus
$ GOPATH / src
$ GOPATH / pkg / mod
Der GOPATH-Modus und der Modulmodus wechseln je nach Vorhandensein oder Nichtvorhandensein der Datei "go.mod"
go.mod
-Datei fehltgo.mod
-Datei (** Sie ist auch dann gültig, wenn sich go.mod in der Hierarchie über dem auszuführenden Verzeichnis befindet **)Verzeichnisaufbau
.
└── main.go
main.go
package main
import (
"fmt"
"github.com/antonholmquist/jason" //Externe Pakete importieren
)
func main() {
v, _ := jason.NewObjectFromBytes([]byte(`{"Name": "fetaro"}`))
fmt.Println(v)
}
$GOPATH/src/
Insbesondere "$ GOPATH / src / github.com / antonholmquist / jason"
Paket kann nicht gefunden
Fehler
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
Insbesondere "go get github.com / antonholmquist / jason"
Verzeichnisaufbau
.
├── go.mod ←go.Da ich die Mod-Datei abgelegt habe, geht sie in den Modulmodus
└── main.go
main.go
package main
import (
"fmt"
"github.com/antonholmquist/jason" //Externe Pakete importieren
)
func main() {
v, _ := jason.NewObjectFromBytes([]byte(`{"Name": "fetaro"}`))
fmt.Println(v)
}
go.mod
module hoge
go 1.14
$GOPATH/pkg/mod
Insbesondere /Users/tetsutaro.watanabe/go/pkg/mod/github.com/antonholmquist/jason \ @ v1.0.0 /
Es wird ohne Erlaubnis heruntergeladen.
Wenn Sie "go main.go" ausführen, während es noch nicht heruntergeladen wurde, wird es heruntergeladen und dann wie unten gezeigt ausgeführt.
$ 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 ← Ergebnis herunterladen
{"Name":"fetaro"}← Ausführungsergebnis
Nach dem Herunterladen wird go.mod
neu geschrieben
Umgeschrieben go.mod
module hoge
go 1.14
require github.com/antonholmquist/jason v1.0.0 // indirect
Verzeichnisaufbau
.
├── main.go
└── mypkg ← Internes Paket
└── bar.go
main.go
package main
import (
"./mypkg" //Interne Pakete importieren
)
func main() {
mypkg.PrintBar()
}
bar.go
package mypkg
import "fmt"
func PrintBar(){
fmt.Println("bar")
}
. / mypkg
mit einem relativen Pfad von main.go
Paket kann nicht gefunden
Fehler
main.go:4:2: cannot find package "." in:
/Users/tetsutaro.watanabe/git/golab3/mypkg
Verzeichnisaufbau
.
├── go.mod ←go.Modulmodus, weil es einen Mod gibt
├── main.go
└── mypkg ← Interne Bibliothek
└── bar.go
main.go
package main
import (
"mymodule/mypkg" //← geh hier.Modulname geschrieben in mod+Machen Sie daraus einen Paketnamen
)
func main() {
mypkg.PrintBar()
}
go.mod
module mymodule
go 1.14
bar.go
package mypkg
import "fmt"
func PrintBar(){
fmt.Println("bar")
}
Das ist schwierig. Im Modulmodus ist das beim Import angegebene "mymodule / mypkg" eine Verkettung eines Moduls und eines Pakets.
Insbesondere suchen Sie nach (Modulname in go.mod beschrieben) + (relativer Pfad des Pakets vom Speicherort von go.mod).
In diesem Beispiel ist "mymodule" das Modul und "/ mypkg" der relative Pfad aus dem Verzeichnis, das "go.mod with module mymodule" enthält.
Erhalten Sie einen Fehler
main.go:4:2: package mymodule/mypkg is not in GOROOT (/usr/local/Cellar/go/1.14.3/libexec/src/mymodule/mypkg)
Fall, in dem go.mod höher als main.go ist
Zum Beispiel im Fall der folgenden Verzeichnisstruktur
.
├── c_pkg
│ ├── d_pkg
│ │ └── bar.go
│ └── main.go
└── go.mod
Wenn Sie in go.mod module a_module / b_module
angeben,
In main.go kann es mit "import" a_module / b_module / c_pkg / d_pkg "" gelesen werden
Allgemeine cmd- und interne Konfigurationen
.
├── 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