問題
寫了個自定義的包 calc.go
,在路徑 $GOPATH/go_project/src/demo_51_package/com/
目錄下,其中main.go 是main方法的入口
代碼
main.go
代碼如下
package main
import "demo_51_package/com"
func main() {add := calc.Add(1, 2)println(add)
}
calc.go
代碼如下
package calc
/*** 首字母大寫才能別其他的包使用*/
func Add(x int,y int)(int){return x + y
}
運行
當我運行時出現了以下錯誤
package demo_51_package is not in GOROOT (/Users/yexindong/Documents/go_root_path/go/src/demo_51_package)
看圖吧,跟上面的 字一樣的
這個錯誤告訴你項目demo_51_package
不在go的根目錄中,導入包名是從$GOPATH/src/
后開始計算的,使用/進行路徑分隔。但我看自己的導入包并沒有錯,這是怎么回事呢?
原因
是GOPATH的問題嗎?
一開始以為是GOPATH
的問題,配置了idea的GOPATH
后,發現還是一樣,為此就可證明不是GOPATH
的問題,先瞥一眼GOPATH
的配置(這個配置是正確的?)
和go的環境變量中的GOPATH是可以對得上的,通過go env
命令查看
原來是go mod
的原因
通過查找資料,發現是go mod的原因,并且我電腦上的go mod
默認是開啟的,通過命令go env
查看go的環境變量,輸入命令后會打印好多行的內容,這里我們只關注以下這一行的配置,就是gomod的狀態,發現是開啟的
GO111MODULE="on"
那么問題來了。什么是go mod
呢?
go mod 是什么
Go.mod是Golang1.11版本新引入的官方包管理工具用于解決之前沒有地方記錄依賴包具體版本的問題,方便依賴包的管理,可以理解為java中的maven;談到maven就熟悉了,其實就是依賴管理的工具嘛,可以用來控制依賴的版本;
最早的時候,Go所依賴的所有的第三方庫都放在GOPATH這個目錄下面,下載的依賴包也沒有版本概念,這就導致了同一個庫只能保存一個版本的代碼。如果不同的項目依賴無法依賴同一個第三方的庫的不同版本,并且,代碼開發必須在go path src目錄下。這在實際開發中造成許多的問題。
解決方案
方案一:關閉go mod
這個方案非常簡單,只需要在命令行輸入以下命令即可
go env -w GO111MODULE=off
方案二:將項目轉為module(模塊)
進入項目目錄demo_51_package
下,輸入以下2個命令
# 初始化模塊-- init 后面的名稱一定要和項目目錄相同
go mod init demo_51_package# 下載依賴包
go mod tidy
執行后會發現,項目下多了個go.mod的文件
這個文件內容也非常簡單,只有2行數據
module demo_51_packagego 1.17
在次運行
配置完成后,在編譯并執行main方法,發現已經可以正常運行了