在golang中,所有源文件都属于一个包,golang的包具有以下特性:

  • 包可以被其他包引用
  • 每个golang程序只有一个main包
  • 包的主要用途是提高代码的可复用性

本节,我们将介绍包的相关概念以及使用方法,如果你还没有阅读过前面的文章,可以通过以下链接进行阅读

一. GOPATH 环境变量

1. 什么是GOPATH?

GOPATHGOPATH
  • src:存放各种包源代码,src里的一个目录就是一个包
  • pkg:存放编译源代码后的类库
  • bin:存放编译源代码后的可执行程序
GOPATH
GOPATH
    1. GOROOT/src:该目录保存了Go标准库里代码。
    1. GOPATH/src:该目录保存了应用自身的代码和第三方依赖的代码。

2. 设置GOPATH环境变量

sudo vim /etc/profileGOPATHGO111MODULEGO111MODULE
export GOPATH=/Users/pan/go # 把自己的golang项目目录作为GOPATH的变量
export GO111MODULE=off # 关闭golang 11.1 版本以后的模块功能
source /etc/profile

3. 包的使用

(1)main包与包的引入

a. 引入系统包

packageimport
package main

import (
    // 引入系统的包
    "fmt"
)

func main() {
    // 调用系统包的函数
    fmt.Println("Hello World")
}
mainfmt
jkdev.cn/test/mypkg/lib.go
package mypkg

import "fmt"

func TestFunc() {
    fmt.Println("call testFunc")
}
jkdev.cn/test/main.go
package main

// 引入自定义包
import "jkdev.cn/test/mypkg"

func main() {
    // 调用自定义包的函数
    mypkg.TestFunc()
}

自定义的包由我们自己定义,但要注意的是,一个目录对应一个包,同时,包名应当和目录名一致。引入包时,路径相对应GOPATH/src,我们可以根据自己的程序的功能模块划分不同的包。

(2)包的作用域

  • 包内:在同一个包内定义的函数、变量、常量、结构体,可以被包内的所有其他代码任意访问,它们属于包内公开。

  • 包外:如果函数、变量、常量、结构体位于不同的包下,如果将它们的首字母使用大写标识,表示它们是公开访问的。对于结构体字段。如果想要在包外进行访问,还要让结构体字段变量名使用首字母大写。

二. 编译

go build
/Users/pan/golib.gomain.go

此时,源文件相对于GOPATH的路径如下。接下来我们对这两个go源文件进行编译

go  GOPATH目录
├─src                  源码目录
│  ├─test              项目目录
│     ├─lib.go         公共函数文件
│     └─main.go        主函数文件

lib.go 代码如下:

package main

import "fmt"

func testFunc() {
    fmt.Println("call testFunc")
}

main.go代码如下:

package main

func main() {
    testFunc()
}
mainlib.go

1. go build

GOPATH
# 进入源码目录
cd ~/go/src/test
# 编译代码
go build
-o
go build -o main

2. go build 文件列表

使用“go build+文件列表”编译时,文件列表中的每个文件必须是同一个包的 Go 源码

# 进入源码目录
cd ~/go/src/test
# 编译
go build lib.go main.go

3. go build 包

GOPATHGOPATH/src
# test 相对于GOPATH/src
go build test

4. go install

go buildgo installgo install

5. go build 和 go install 对比

  • 相同点:都能生成可执行文件
  • 不同点:go build 不能生成包文件, go install 可以生成包文件;go build 生成可执行文件在当前目录下, go install 生成可执行文件在bin目录下($GOPATH/bin)。

三、 Go模块

GO111MODULE

1. GO111MODULE环境变量

用环境变量GO111MODULE设置开启或者关闭模块支持,它有三个可选值:off、on、auto,默认是auto。

GO111MODULE=offGO111MODULE=ongo.modGO111MODULE=autogo.mod

在使用模块的时候,GOPATH是无意义的,但golang还是会把下载的依赖存储于GOPATH之下。

2. 使用go模块

GO111MODULEgo.mod
# 创建一个空的工作目录
mkdir -p ~/Work/go/test
# 进入工作目录
cd ~/Work/go/test
# 初始化一个module
go mod init testmodule
go.mod
module testmodule

go 1.16

(1)下载依赖

go get 包名
go get github.com/satori/go.uuid
GOPROXYgo.mod
module testmodule

go 1.16

require github.com/satori/go.uuid v1.2.0 // indirect

go.modgo mod download
module testmodule

go 1.16

require (
    github.com/satori/go.uuid v1.2.0 // indirect
    gorm.io/gorm v1.21.11 // indirect
)

(2)更新依赖关系

go mod tidygo buildgo install

本文介绍了Go的包的基本管理方法,后面,我们会循序渐进地介绍golang的基础知识。如果喜欢,欢迎订阅!