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的主要内容,如果未能解决你的问题,请参考以下文章

Golang学习--包管理工具glide

Golang包管理工具之govendor的使用

Golang包管理工具之govendor的使用

Glide--------Golang依赖包解决工具之错误实践

Golang Gin 项目包依赖管理 godep 使用

Golang环境安装和依赖管理