GO环境变量中GO111MODULE到底是干啥的?
- 查看GO111MODULE变量
- GO111MODULE的作用
- GO111MODULE的案例演示
一,查看GO111MODULE变量
]# go env GO111MODULE
或者
]# go env | grep GO111MODULE
二,GO111MODULE的作用
- auto : 自动判断机制
当项目位于 $GOPATH/src 目录外且包含 go.mod 文件时,自动启用模块支持;若项目在 $GOPATH/src 内,则禁用模块支持,沿用传统的 GOPATH 机制 - on : 强制启用模块支持
依赖管理通过 go.mod 文件进行版本控制
依赖包会被下载到 $GOPATH/pkg/mod 目录下
构建过程不依赖 GOPATH 环境变量 - off: 强制禁用模块支持
依赖包需要手动 go get 到 $GOPATH/src 下
项目导入路径必须匹配 $GOPATH/src 下的目录结构
所有依赖必须存在于 GOPATH 中
三、GO111MODULE 使用示例
首先我们配置强制开启
window配置方式:
go env -w GO111MODULE=on
Linux配置方式:
echo “go env -w GO111MODULE=off” >> ~/.bashrc
执行 source ~/.bashrc 使配置生效
验证一下是否修改成功
可以看到变量已经成功设置成off的状态 并且我们的GOPATH=/root/go
这也就意味着我们的package包只会在/root/go/src目录下寻找
下面是我的目录结构
[root@VM-0-3-centos go]# tree src/
src/
├── maindir
│ └── main.go
└── salary└── person└── person.go
代码我贴在下面]# cat /root/go/src/salary/person/person.go
package person
import ("fmt"
)
type person struct {Name stringage int sal float64
}func NewPersion(name string, age int, sal float64) *person {return &person{Name : name,age: age,sal: sal,}
}func (p *person) SetAge(age int){if age >0 && age < 150 {p.age = age}else{fmt.Println("++++不合理++++")}
}
func (p *person) GetAge() int {fmt.Println(p.age)return p.age}func (p *person) SetSal(sal float64) {if sal >= 3000 && sal <= 30000 {p.sal = sal}else{fmt.Println("++++++++salary out of range+++++")}
}
func (p *person) GetSal() float64 {fmt.Println(p.sal)return p.sal
}
]# cat /root/go/src/maindir/main.go
package main
import ("fmt""salary/person"
)func main() {fmt.Println("Starting the main program...")p := person.NewPersion("TOM",21,3000.15)p.GetAge()p.GetSal()p.SetAge(55)p.SetSal(30000)p.GetAge()p.GetSal()
}
下面我们来执行下
package main
import ("fmt""salary/person"
)func main() {fmt.Println("Starting the main program...")p := person.NewPersion("TOM",21,3000.15)p.GetAge()p.GetSal()p.SetAge(55)p.SetSal(30000)p.GetAge()p.GetSal()
}
可以看到执行成功了
同样的,我在/data/MYPROJECT/目录下有一份结构一样的代码。如下图所示
[root@VM-0-3-centos data]# tree MYPROJECT/
MYPROJECT/
├── maindir
│ └── main.go
└── salary└── person└── person.go
代码是和上边一模一样的,我就不粘贴了,下面我们运行一下试试效果,不过我需要删掉/root/go/src/目录下的person包
可以看到,他并没有在GOROOT或者GOPATH中找到对应的person package.
那么这个时候,我们打开GO111MODULE=on
[root@VM-0-3-centos maindir]# sed -i 's@GO111MODULE=off@GO111MODULE=on@g' ~/.bashrc
[root@VM-0-3-centos maindir]# cat ~/.bashrc | tail -1
go env -w GO111MODULE=on
[root@VM-0-3-centos maindir]# source ~/.bashrc
[root@VM-0-3-centos maindir]# go env GO111MODULE
on
可以看到目前GO111MODULE是开启状态
这个时候我们需要go mod init PROJECT让他识别到当前项目,不是必须从GOPATH路径寻找package
[root@VM-0-3-centos MYPROJECT]# go mod init MYPROJECT
go: creating new go.mod: module MYPROJECT
go: to add module requirements and sums:go mod tidy
[root@VM-0-3-centos MYPROJECT]# go mod tidy
可以看到生成了一个go.mod文件
这个时候我们需要稍微修改一下main.go. 因为我们初始化的项目根目录是MYPROJECT.
修改成如下import 路径
下面让我们运行一下
[root@VM-0-3-centos maindir]# go env GO111MODULE
on
[root@VM-0-3-centos maindir]# pwd
/data/MYPROJECT/maindir
[root@VM-0-3-centos maindir]# go run main.go
21
3000.15
55
30000
可以看到运行成功了,利用go mod 可以成功的摆脱了GOPATH的限制.