在 Go 中,包是一种组织代码的方式,可以将相关的代码放在同一个包中,方便管理和复用。每个 Go 文件都必须属于一个包,而且包名必须与文件名或者目录名相同。通常情况下,包名应该采用小写字母,例如 fmt、net、http 等标准库中的包名。如果包名由多个单词组成,可以使用下划线分隔,例如 my_math、my_database 等自定义包中的包名。

变量和函数名的可见性

在一个包中,可以定义变量、常量、函数、类型和方法等。其中,变量和函数名的首字母大小写决定了它们的可见性,即是否可以被其他包引用。如果一个变量或者函数名的首字母是大写字母,那么它可以被其他包引用;如果首字母是小写字母,那么它只能在当前包内使用。

在一个 Go 程序中,可以使用 import 语句引入其他包,例如:

import "fmt"

上面的代码引入了 Go 标准库中的 fmt 包,可以使用 fmt 包中的函数和类型。

fmt.Println("test")

import 原理

当你在一个 Go 文件中使用 import 语句导入一个包时,Go 编译器会在 GOPATH 和 GOROOT 环境变量指定的路径中查找该包。如果找到了该包,编译器会将该包的代码编译成对象文件,并将其链接到你的程序中。

当你在项目中使用 import 语句导入一个包时,Go 编译器会按照以下顺序查找该包:

  1. 当前目录下的 vendor 目录。
  2. GOPATH 环境变量指定的路径下的 src 目录。
  3. GOROOT 环境变量指定的路径下的 src 目录。

如果在当前目录下的 vendor 目录中找到了该包,Go 编译器会直接使用该包,而不会去 GOPATH 或 GOROOT 中查找。这意味着,你可以将项目所依赖的第三方包放在 vendor 目录中,而不必担心与其他项目的依赖冲突。

需要注意的是,vendor 目录只对当前项目有效。如果你的项目是一个库,其他项目使用该库时,它们不会使用你的 vendor 目录中的依赖包。因此,如果你的项目是一个库,你应该将依赖包添加到你的 go.mod 文件中,以确保其他项目可以正确地使用你的库。

如何使用第三方库或者自己编写的包

使用第三方库时,需要先使用 go get 下载并安装库

go get github.com/gin-gonic/gin

上面的命令下载并安装了 gin 框架,可以在代码中使用 import “github.com/gin-gonic/gin” 引入该框架。

编写自己的包

创建一个名为 mymath 的文件夹,并在该文件夹下创建一个名为 add.go 的文件,并且 Add 函数可以被其他的包调用

package mymath

func Add(a, b int) int {
    return a + b
}

Go Modules

Go Modules 是 Go 1.11 及以上版本中引入的一种依赖管理工具,它可以帮助开发者更加方便地管理项目依赖关系。

在使用 Go Modules 时,你可以在任何目录下创建 Go 项目,并使用 go mod 命令来管理依赖关系。Go Modules 会自动下载依赖包,并将它们存储在项目根目录下的 go.mod 和 go.sum 文件中。

使用 Go Modules 的好处包括:

  • 不需要设置 GOPATH 环境变量,可以在任何目录下创建 Go 项目。
  • 可以使用语义化版本控制,确保依赖包的版本兼容性。
  • 可以使用私有仓库或者本地文件系统作为依赖源。
  • 可以使用 go mod tidy 命令自动清理不需要的依赖包。

要使用 Go Modules,你需要按照以下步骤操作:

一、在项目根目录下执行以下命令,初始化 Go Modules

go mod init <module-name>

其中,<module-name> 是你的项目名称

二、在项目中使用第三方包时,可以使用 go get 命令下载依赖包

go get <package-name>

三、在项目中使用已经下载的依赖包时,可以使用 import 语句导入包

import "github.com/gin-gonic/gin"

四、在项目中使用 go mod tidy 命令可以自动清理不需要的依赖包

go mod tidy

示例:

以下演示导入同项目下的包和不同项目的包

目录结构如下:

同项目下 import “项目名称/包名”,包的目录名称和包名保持一致即可,目录下的文件可以自定义

不同项目下 import “项目名称/包名”,

在 go.mod 下增加

require package_test_proj2/mypkg2 v0.0.0
replace package_test_proj2/mypkg2 => ../package_test_proj2


====
import package_test_proj2/mypkg2

代码:

https://github.com/zhengjianhong001/go_example

其他

GOROOT、GOPATH

GOROOT:用于指定 Go 的安装目录,默认值 /usr/local/go(在 Linux 和 macOS 上)或 C:\Go(在 Windows 上)

GOPATH:指定 Go 项目的工作目录,默认值 $HOME/go

可以通过以下命令查询两个环境变量的配置

echo $GOROOT
echo $GOPATH

如果想修改 GOROOT,可以在命令行中使用 export 命令来设置环境变量,例如:

export GOROOT=/path/to/go