【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 &TreeNode{Value: Value}
}

将所有变量的名字首字母大写即可实现public

package main

import "learning_go/tree"

func main() {

	var root tree.TreeNode
	//创建对象的方法
	//1 指定单个参数
	root = tree.TreeNode{Value: 3}
	//2. 使用指针创建
	root.Right = &tree.TreeNode{}
	//3. 指定全部参数
	root.Left = &tree.TreeNode{5, 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值