首页 >后端开发 >Golang >Go模块如何处理内部包以防止外部导入?

Go模块如何处理内部包以防止外部导入?

Patricia Arquette
Patricia Arquette原创
2024-12-10 04:44:09395浏览

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/src 中指定项目路径。创建 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn