[GO-Sprache] Organisieren Sie das Importverhalten an anderen Orten als GOPATH

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)

Grobe Zusammenfassung

Wenn ich den Umriss der Schlussfolgerung schreibe, sieht es wie folgt aus

Einführung

Umgebung

Umschalten zwischen GOPATH-Modus und Modulmodus

Der GOPATH-Modus und der Modulmodus wechseln je nach Vorhandensein oder Nichtvorhandensein der Datei "go.mod"

Import von externem Paket

Import von externen Paketen im GOPATH-Modus

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)
}

Wo wirst du suchen?

$GOPATH/src/

Insbesondere "$ GOPATH / src / github.com / antonholmquist / jason"

Was ist, wenn hier kein Paket vorhanden ist?

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)

Wie platziere ich das Paket?

go get

Insbesondere "go get github.com / antonholmquist / jason"

Import von externen Paketen im Modulmodus

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

Wo wirst du suchen?

$GOPATH/pkg/mod

Insbesondere /Users/tetsutaro.watanabe/go/pkg/mod/github.com/antonholmquist/jason \ @ v1.0.0 /

Was ist, wenn hier kein Paket vorhanden ist?

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

Interner Paketimport

Importieren Sie interne Pakete im GOPATH-Modus

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")
}

Wohin gehen, um zu suchen

. / mypkg mit einem relativen Pfad von main.go

Was ist, wenn hier kein Paket vorhanden ist?

Paket kann nicht gefunden Fehler

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

Importieren Sie interne Pakete im Modulmodus

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")
}

Wohin gehen, um zu suchen

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.

Was ist, wenn hier kein Paket vorhanden ist?

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)

Experimentieren Sie mit Orten, an denen Sie nach 1 suchen müssen

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

Experimentieren Sie mit Orten, an denen Sie nach 2 suchen müssen

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

[GO-Sprache] Organisieren Sie das Importverhalten an anderen Orten als GOPATH
Überprüfen Sie das Verhalten des Zerstörers in Python
Unterschiede im Verhalten jeder LL-Sprache, wenn der Listenindex übersprungen wird
Ein Ruby-Experte lernte die grundlegende Grammatik der Go-Sprache
Über die übersichtliche Anordnung in der Importreihenfolge von Flake8
Funktionen der Go-Sprache
Hinweis zum Standardverhalten von collate_fn in PyTorch
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
Hallo Welt in GO-Sprache
Organisieren Sie nützliche Blogs im Bereich Data Science (Übersee & Japan).
Die Geschichte, dass Vererbungsverhalten in jeder Sprache sehr unterschiedlich ist
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen