Skip to content

包管理器

每一个现代语言都会有属于自己的一个成熟的依赖管理工具, 例如 Java 的 Gradle/maven, Python 的 pip/uv, node.js 的 npm/yarn/pnpm 等, 一个好的依赖管理工具可以为开发者省 去不少时间并且可以提升开发效率, 然而 Go 在早期并没有一个成熟的依赖管理解决方案, 那时所有的代码都存放在 GOPATH 目录下, 对于工程项目而言十分的不友好,版本混乱,依赖难 以管理,为了解决这个问题, Go1.11 官方终于推出了 Go Mod 这款官方的依赖管理工具

go mod 快速入门

1.创建项目 & 初始化

sh
# 创建项目目录
mkdir golang-demo && cd -

# 初始化(类似 pnpm init)
# 会生成一个 go.mod 文件
go mod init

2.创建多个 go 文件

sh
# 程序入口 package main
touch main.go

# 工具函数包
mkdir tools
touch tools/tools.go

项目结构如下:

txt
.                  # golang-demo 项目根目录
├── go.mod
├── main.go
└── tools
    ├── tools.go
    └── utils.go

2 directories, 4 files

3.在 main.go 中导入其他包

go
package main // 定义包名(main是一个必不可少的包, 代表程序入口)

import (
	"fmt"
	"golang_demo/tools" // 注意导入要从 mod.go 中说明的 module 开始
)

func main() {
  // 使用 tools/tools.go 文件中的方法
	colorCode := tools.GenerateRandomColor()
	fmt.Println("color:", colorCode)

  // 使用 tools/utils.go 文件中的方法
	bgColor := tools.GenerateRandomBgColor()
	fmt.Println(bgColor)
}
go
package tools // 定义包名

import (
	"fmt"
	"math/rand"
)

// 注: 要想让其他包可以访问, 函数名必须使用大驼峰
// GenerateRandomColor 生成并返回一个随机的 16 进制颜色代码
// 返回值示例: "#ff0000", "#a3b2c1"
func GenerateRandomColor() string {
	colorCode := rand.Intn(0xFFFFFF + 1)
	return fmt.Sprintf("#%06x", colorCode)
}
go
package tools

// 我并没有到导入, 就可以直接使用同, 一个包下的其他文件中的方法
// 所以, 由此可见:
// 1. package 是 go 语言组织代码结构的最小单元(文件并不是)
// 2. 一个 package 可以有多个文件, 但是一个文件只能有一个 package 定义语句
func GenerateRandomBgColor() string {
	randomColor := GenerateRandomColor()
	return "background-color: " + randomColor
}
go
module golang_demo

go 1.25.5

注意点

  1. (main 除外)包的名称最好是与go文件所在的目录同名(如: tools/tools.go)
  2. main 函数一般都放在 main 包中
  3. 要想让包中的函数/变量被其他包可以访问,就必须使用 大驼峰(如: GenerateRandomColor)
  4. package 是go组织代码结构的最小单元, 同一个包中的函数/变量可以直接被另外一个文件访问
  5. 同一个目录下的多个文件必须只能属于同一个包(如: tools/tools.go 和 tools/utils.go 都是 tools 包)

init 函数

它是一个比较特殊的函数, 他会在包初始化的时候的执行, 所有的包都可以定义一个 init 函数

  1. 全局变量定义
  2. init 执行
  3. main 执行
  4. 如果有多个包, 那么被导入的包的 init 函数会先执行
go
package main

import (
	"fmt"
)

var num int = 10

func main() {
  // 然后再执行 main
	fmt.Println("我是 main 函数")
}

func init() {
  // 先执行它(即使我写在main函数后面,也是我先执行)
  fmt.Println("获取 num 的值", num)
	fmt.Println("我是 init 函数")
}

管理第三方模块

设置国内镜像

sh
# 在你的 ~/.zshrc 中导出全局变量
export GOPROXY='https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,https://goproxy.io,https://goproxy.bj.bcebos.com,direct'

编译安装工具

有些工具不是作为一个代码库来使用的, 而是它原本就是一个功能齐全的软件 比如: lazygit 但是它也能用 go install 命令来安装

sh
go install github.com/jesseduffield/lazygit@latest

安装代码库

安装一些别人封装好的代码, 用到自己的业务代码中, 比如日志处理库

sh
go get github.com/sirupsen/logrus
go
package main

import (
	"github.com/sirupsen/logrus"
)

func main() {
	logrus.Info("Info Log")
	logrus.Warn("Warn Log")
	logrus.Error("Error Log")
}

Released under the MIT License.