Heim >Backend-Entwicklung >Golang >Wie gehen Go-Module mit internen Paketen um, um externe Importe zu verhindern?

Wie gehen Go-Module mit internen Paketen um, um externe Importe zu verhindern?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-10 04:44:09477Durchsuche

How Do Go Modules Handle Internal Packages to Prevent External Imports?

Organisation von Go-Code mit internen Paketen

Interne Pakete verstehen

Interne Pakete, gekennzeichnet durch das Verzeichnis „internal“. sind zum Gruppieren verwandten Codes gedacht, der nicht außerhalb des Projekts verfügbar gemacht werden sollte. In Go-Modulen können interne Pakete nicht von externen Projekten importiert werden.

Modulstruktur

Im bereitgestellten Beispiel ist die Projektstruktur wie folgt:

project/
  internal/
    foo/
      foo.go  # package foo
    bar/
      bar.go  # package bar
  main.go

wobei main.go die internen Pakete project/internal/foo und importiert project/internal/bar.

Importproblem

Das Problem, auf das Sie gestoßen sind, war der Versuch, interne Pakete von außerhalb des Projektverzeichnisses zu importieren. Interne Pakete können nur aus demselben Projekt importiert werden, daher würde die Verwendung der Pfade project/internal/foo und project/internal/bar aus main.go nicht funktionieren.

Lösung mit Go-Modulen

Mit der Einführung von Go-Modulen in Go v1.11 ist es jedoch nicht mehr notwendig, Ihren Projektpfad in $GOPATH/src anzugeben. Erstellen Sie eine go.mod-Datei und definieren Sie die internen Paketmodule wie folgt:

project/
  go.mod
  main.go
  
\---internal
    +---bar
    |       bar.go
    |       go.mod
    |
    \---foo
            foo.go
            go.mod
project/internal/bar/go.mod
module bar

go 1.14
project/internal/bar/bar.go
package bar

import "fmt"

// Bar prints "Hello from Bar"
func Bar() {
    fmt.Println("Hello from Bar")
}
project/internal/foo/go.mod
module foo

go 1.14
project/internal/foo/foo.go
package foo

import "fmt"

// Foo prints "Hello from Foo"
func Foo() {
    fmt.Println("Hello from Foo")
}
project/main.go
package main

import (
    "internal/bar"
    "internal/foo"
)

func main() {
    bar.Bar()
    foo.Foo()
}
project/go.mod
module project

go 1.14

require internal/bar v1.0.0
replace internal/bar => ./internal/bar
require internal/foo v1.0.0
replace internal/foo => ./internal/foo

Schlüssel Punkte

  • Interne Pakete dürfen nur innerhalb desselben Projekts verwendet werden.
  • Go-Module bieten eine Möglichkeit, Projekte mit internen Paketen mithilfe von go.mod-Dateien und Ersetzungsanweisungen zu strukturieren.
  • Die Versionierung in „Require and Replacement“ hat keinen Einfluss auf die Funktionalität, solange das Paket am richtigen Speicherort gefunden wird.

Das obige ist der detaillierte Inhalt vonWie gehen Go-Module mit internen Paketen um, um externe Importe zu verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn