- GoLand是一個比較好用的IDE,但只免費試用30天,也可用免費的vscode,簡單代碼可直接使用notepad+,甚至vim;
- 使用GoLand的“Attach project”功能可類似Eclipse那樣同時多個項目;
- 建議直接從1.13或更高版本開始,最低也應當從1.11版本開始,因爲go包依賴管理工具“go mod”是1.11版本引入的,而新的代理設置方式是1.13版本引入的;
- 建議使用“go mod”方式編譯,而不是依賴環境變量GOPATH的編譯方式,後者約束多;
- GO的源代碼文件後綴爲“.go”;
- 每一個源碼文件均要有包名,即需要package這一行;
- main函數所在包名只能爲main;
- 如果main包有多少個文件,則編譯時需指定全部,但不用指定其它包的文件,如:
go build -o helloworld main.go hello.go world.go |
- GO中沒有繼承,只有包含關係;
- 包名可不同於所在目錄名;
- 同一目錄下不能有不同包名(沒編譯到的除外);
- 同名包,可使用包別名特性解決(比如兩個第三方庫存在同名包);
- 同一包(名相同)不能存在多個目錄下(因爲import針對的是目錄,多個時有import包重複聲明問題);
- 在一個go源碼文件中,一個包只能有一個import,否則存在包重複聲明問題;
- 定義的變量名能和被引用的包名相同;
- 變量、函數名、結構體等,如果以小寫字母打頭只能同一包內使用,以大寫打頭則可被其它包使用,可理解爲小寫打頭的爲包私有的,而大寫打頭是共有的;
- 結構體變量可以“{}”方式初始化;
- GOPATH編譯方式有目錄結構約束,比如需有src目錄;
- “go mod”方式編譯沒有目錄結構約束,但注意須在項目根目錄下執行“go mod init <模塊名>”以生成文件“go.mod”;
- “go mod”方式的import要帶上模塊名,然後纔是目錄名,沒有包含包名,如:
|
- “go get”下載拉取的文件被房子GOPATH目錄下,如果沒有設置環境變量GOPATH,則執行“go env|grep GOPATH”可查看的GOPATH值,否則以環境變量GOPATH爲準;
- 當“go get”不可用時,可以手工下載包;
- 當網絡牆原因“go get”不可用時,可考慮使用七牛雲的代理goproxy.cn或者goproxy.io,但通常goproxy.cn更好用;
- “go get”設置代理方式(1.13及以上版本):
go env -w GOPROXY=https://goproxy.cn,direct |
默認可能是“GOPROXY="https://proxy.golang.org,direct"”,可執行“go env|grep GOPROXY”確認。
- 手工下載的包,可在go.mod文件中指定,注意一個包同時需要有require和replace,如:
require google.golang.org/grpc v1.27.1 // indirect replace google.golang.org/grpc => /usr/local/go/src/google.golang.org/grpc |
- 可把命令go看作gcc,使用Makefile組織管理編譯;
- 接口interface變量一般定義爲對象,結構體struct變量一般定義爲指針;
- 一個結構體只要實現了接口的所以方法,即爲對接口的實現,不需像C++或JAVA那樣顯示指定,也不能顯示指定,這是語法規定(缺點是不方便查找一個接口有哪些實現,一個結構體實現了哪些接口);
- JSON字符串可以直接反射爲結構體,反過來也可以;
- GO中的string不像C++中std::string,並不支持二進制數據,二進制數據要使用byte類型;
- 可調用runtime.GOMAXPROCS設置進程最多佔用的cpu核數;
- 可調用runtime.NumCPU得到cpu核數;
- 可調用debug.SetMaxThreads設置進程最多啓動的線程數;
- 線程對程序是透明的,程序看到的是協程;
- go並不直接支持fork調用,但有os.Exec這樣的調用;
- 不支持C和C++那樣的隱式類型轉換,即使是整數類型間轉換也需顯示指定;
- “:=”方式聲明變量,需保證至少包含一個新變量。
附:易遇編譯錯誤
- missing dot in first path element
如下錯誤可能是需要先到上一級目錄先編譯一次:
build command-line-arguments: cannot load test/hello: malformed module path "test/hello": missing dot in first path element |
也有可能是import問題,比如下面這樣:
import ( "fmt" myproto "proto" ) import ( "test/proto" ) |
得把myproto那一行刪除。
- but does not contain package
build command-line-arguments: cannot load github.com/go-redis/redis/v7: module github.com/go-redis/redis/v7@latest found (v7.2.0), but does not contain package github.com/go-redis/redis/v7 |
這個可能是因爲沒有目錄的可執行和文件的讀取權限,比如go-redis的屬主是root,而使用的是非root,解決辦法是爲目錄增加可執行權限和文件增加可讀權限。
- go.mod: no such file or directory
go: google.golang.org/[email protected]: parsing /usr/local/go/src/google.golang.org/grpc/go.mod: open /usr/local/go/src/google.golang.org/grpc/go.mod: no such file or directory |
遇到這個錯誤時,可嘗試將go.mod文件刪除後重執行“go mod init”操作,然後再執行“go build”編譯。執行“go build”有個提前,即要能拉取(go get)互聯網上的依賴的包。