Maison >développement back-end >Golang >Comment les modules Go gèrent-ils les packages internes pour empêcher les importations externes ?

Comment les modules Go gèrent-ils les packages internes pour empêcher les importations externes ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-10 04:44:09396parcourir

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

Organisation du Go Code avec des packages internes

Comprendre les packages internes

Packages internes, désignés par le répertoire "interne" , sont destinés au regroupement du code associé qui ne doit pas être exposé en dehors du projet. Dans les modules Go, les packages internes ne peuvent pas être importés par des projets externes.

Structure du module

Dans l'exemple fourni, la structure du projet est la suivante :

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

où main.go importe les packages internes project/internal/foo et project/internal/bar.

Importer Problème

Le problème que vous avez rencontré était la tentative d'importation de packages internes depuis l'extérieur du répertoire du projet. Les packages internes ne peuvent être importés qu'à partir du même projet, donc utiliser les chemins project/internal/foo et project/internal/bar depuis main.go ne fonctionnerait pas.

Solution avec les modules Go

Cependant, avec l'introduction des modules Go dans Go v1.11, il n'est plus nécessaire de spécifier le chemin de votre projet dans $GOPATH/src. Créez un fichier go.mod et définissez les modules internes du package comme suit :

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

Clé Points

  • Les packages internes sont limités à une utilisation dans le même projet.
  • Les modules Go fournissent un moyen de structurer des projets avec des packages internes à l'aide de fichiers go.mod et de remplacer les directives.
  • La gestion des versions dans require et replace n'affecte pas la fonctionnalité, tant que le package se trouve au bon emplacement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn