- 查看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的限制.