golang学习路径04包管理依赖管理GoMoudle
Posted 如何在5年薪百万
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang学习路径04包管理依赖管理GoMoudle相关的知识,希望对你有一定的参考价值。
封装和包管理
封装 package
- 每个目录一个包,有且只有一个package
- 包名可以不和文件名一致
- main package包含可执行入口
- 为struct定义的方法必须在相同包内(可以是不同文件)
封装特性
任何属性的命名首字母是否大写代表了其封装状态
- 首字母大写 public
- 首字母小写 private
package tree
import "fmt"
type TreeNode struct
Value int
Left, Right *TreeNode
//给tree定义一个方法print
//小括号代表this指向括号内接收的对象,node指向对象引用
func (node TreeNode) Print()
fmt.Print(" ", node.Value)
//set pointer实现引用传递
func (node *TreeNode) SetValue(val int)
node.Value = val
func (node *TreeNode) Traverse()
if node == nil
return
//中序遍历,先左后右边
node.Left.Traverse()
node.Print()
node.Right.Traverse()
/**
工厂方法
*/
func TreeNodeFactory(Value int) *TreeNode
return &TreeNodeValue: Value
将所有变量的名字首字母大写即可实现public
package main
import "learning_go/tree"
func main()
var root tree.TreeNode
//创建对象的方法
//1 指定单个参数
root = tree.TreeNodeValue: 3
//2. 使用指针创建
root.Right = &tree.TreeNode
//3. 指定全部参数
root.Left = &tree.TreeNode5, nil, nil
//4. new关键字创建
root.Right.Left = new(tree.TreeNode)
//5. 工厂模式创建
root.Left.Right = tree.TreeNodeFactory(2)
6. 数组定义可以简写
//nodes := []TreeNode
// value: 3,
// ,
// 6, nil, nil,
//
root.SetValue(99)
root.Print()
pRoot := &root
pRoot.SetValue(90)
pRoot.Print()
root.Traverse()
依赖管理Go Modules
GOROOT vs GOPATH
- goroot golang源码二级制文件位置
- gopath golang的工作目录
- bin build或install生成的二进制文件
- pkg 存储依赖目标文件,加快编译速度
- src 所有源码文件
依赖管理的三种方式
- GOPATH
- GOVENDOR
- go mod
gopath
- gopath比较早了,使用gopath需要关闭GO111MODULE.
- gopath模式下,import的依赖会从gopath和goroot目录查询对应依赖,如果找不到就会报依赖错误。
- 无版本概念,go get默认拉去最新版本
go mod依赖管理
go modules的目的就是淘汰gopath管理方式
go mod命令
以go mod开头的系列命令管理 golang模块依赖关系
命令 | 含义 |
---|---|
go mod int | 初始化时生成go.mod文件 |
go mod download | 下载go.mod文件中所有依赖 |
go mod tidy | 整理现有的依赖 |
go mod graph | 查看现有的依赖结构 |
go mod edit | 编辑go.mod文件 |
go mod vendor | 导出项目所有依赖到vendor目录 |
go mod vverify | 校验一个模块是否被修改过 |
go mod why | 查看为什么依赖某个模块 |
go mod环境变量
# 查看所有环境变量
go env
# 修改环境变量
go env -w GO111MODULE=on
GO111MODULE=“on”
- auto 有 go.mod文件启动,否则关闭
- on 强制启动
- off 强制关闭
从111版本以后,建议直接开启
# 安装最新版本依赖
go get -u go.uber.org/zap
# 代码中直接import会自动引入
GOPROXY
下载依赖包的时候,从哪个托管平台下载依赖。在国内使用需要使用国内代理
- direct 如果从proxy拉去不到依赖库,就从源(pkg的域名地址)拉取,如果还是找不到就报错
GOSUMDB
指定一个网站作为gosubdb网站,用于校验依赖库的校验地址,检查下载的包是否被篡改过
GONOPROXY\\GONOSUMDB\\GOPRIVITE
如果以来的是私有仓库,就没必要通过goproxy下载和校验,通过goprivate覆盖(使不生效)GOPROXY和GOSUMDB变量。
项目初始化
- 设置 GO111MODULE=on
- 创建项目文件夹
- gomod下不需要在gopath下创建
- go mod init $模块名称 生成go.mod文件
- 写代码引入依赖
- go get或者go mod 下载依赖
- 运行程序
注: go get 模块名可以下载单个依赖,go mod会下载写的gomod 文件所有依赖
一个package下只能有一个main函数
go get 下载依赖的包
编译当前目录及子目录所有文件
go build ./...
打包exe文件,到gopath目录下/bin目录
go install ./...
包管理依赖管理
- import是从$GOPATH路径开始
- import _ “fmt” 可以引入pkg但不使用
- import alias “fmt” 给导入包一个别名
- import . “fmt” 不需要使用包名就可以直接调用函数。相当于把需要导入的包内的函数直接放在当前pkg
以上是关于golang学习路径04包管理依赖管理GoMoudle的主要内容,如果未能解决你的问题,请参考以下文章