Go包的使用与依赖管理

169 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19天,点击查看活动详情

本文分享包的使用,以及通过go mod进行依赖管理

基本概念

package 定义包名。包名一般和目录名保持一致,使用小写字母进行命名

import 导入包。重名时,可以通过起别名,导入不同的包

_,匿名导入,目的主要是为了加载这个包,从而使得这个包中的资源得以初始化

import _ "github.com/go-sql-driver/mysql"

可见性:标识符首字母大写为public公开访问,小写为private只在包内可访问

标准库:go内置的包,例如fmt os,在GOROOT/src目录下

init初始化

  • 单个文件多个init:按行顺序执行;
  • 同一个包多个文件多个init:先按文件名顺序,然后按行顺序执行;
  • 多个包相互依赖:init按依赖关系逆序执行,确保main开始执行时所有依赖包的初始化已完成

注意

  1. init不能不显式调用,在程序执行时会自动被调用;
  2. 在init函数执行之前,变量和常量是先会被完成初始化的;
package main

import "fmt"

var haha = "haha"

const AAA = 1

func init() {
  fmt.Println("init")
  fmt.Println(haha, AAA)
}

func main() {
  fmt.Println("hello package")
}

输出:
init
haha 1
hello package

main程序入口

  • main包必须包含main函数,main函数只能在main包下面
  • main函数,不能指定入参和返回类型,否则编译会报错

Go 程序启动顺序

  1. 按顺序导入所有被 main 包引用的其它包,然后在每个包中执行如下流程:
  2. 如果该包又导入了其它的包,则从第一步开始递归执行,但是每个包只会被导入一次。
  3. 然后以相反的顺序在每个包中初始化常量和变量,如果该包含有 init 函数的话,则调用该函数。
  4. 在完成这一切之后,main 也执行同样的过程,最后调用 main 函数开始执行程序。

go module

go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具

开启go module

go env -w GO111MODULE=on

go env -w GOPROXY=goproxy.cn,direct

常用命令

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖

go get的使用

获取最新版本包:go get -u github.com/xxx

语义化版本号: go get foo@v1.2.3

git分支或tag: go get foo@master

git提交哈希: go get foo@e3702bed2

引入本地不同项目的包

先使用,require "github.com/pkgv2" v0.0.0

然后使用,replace "github.com/pkgv2" => "../pkgv2"

如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!