ホームページ >バックエンド開発 >Golang >Go モジュールは外部インポートを防ぐために内部パッケージをどのように処理しますか?

Go モジュールは外部インポートを防ぐために内部パッケージをどのように処理しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-10 04:44:09396ブラウズ

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

内部パッケージを使用した Go コードの構成

内部パッケージについて

内部パッケージ (「internal」ディレクトリで示される) 、プロジェクトの外部に公開すべきではない関連コードをグループ化することを目的としています。 Go モジュールでは、内部パッケージを外部プロジェクトによってインポートすることはできません。

モジュール構造

提供された例では、プロジェクト構造は次のとおりです:

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

ここで、main.go は内部パッケージ project/internal/foo をインポートし、 project/internal/bar.

インポートの問題

発生した問題は、プロジェクト ディレクトリの外部から内部パッケージをインポートしようとしたことでした。内部パッケージは同じプロジェクト内からのみインポートできるため、main.go からパス project/internal/foo および project/internal/bar を使用しても機能しません。

Go モジュールを使用した解決策

ただし、Go v1.11 で Go モジュールが導入されたため、プロジェクト パスを指定する必要はなくなりました。 $GOPATH/ソース。 go.mod ファイルを作成し、次のように内部パッケージ モジュールを定義します:

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

キーポイント

  • 内部パッケージは、同じプロジェクト内での使用に制限されています。
  • Go モジュールは、go.mod ファイルを使用して内部パッケージでプロジェクトを構造化し、ディレクティブを置き換える方法を提供します。
  • パッケージが正しい場所で見つかっている限り、require および replace でのバージョン管理は機能に影響しません。場所。

以上がGo モジュールは外部インポートを防ぐために内部パッケージをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。