零基礎GO入門筆記

 

  1. GoLand是一個比較好用的IDE,但只免費試用30天,也可用免費的vscode,簡單代碼可直接使用notepad+,甚至vim;
  2. 使用GoLand的“Attach project”功能可類似Eclipse那樣同時多個項目;
  3. 建議直接從1.13或更高版本開始,最低也應當從1.11版本開始,因爲go包依賴管理工具“go mod”是1.11版本引入的,而新的代理設置方式是1.13版本引入的;
  4. 建議使用“go mod”方式編譯,而不是依賴環境變量GOPATH的編譯方式,後者約束多;
  5. GO的源代碼文件後綴爲“.go”;
  6. 每一個源碼文件均要有包名,即需要package這一行;
  7. main函數所在包名只能爲main
  8. 如果main包有多少個文件,則編譯時需指定全部,但不用指定其它包的文件,如:

go build -o helloworld main.go hello.go world.go

 

  1. GO中沒有繼承,只有包含關係;
  2. 包名可不同於所在目錄名;
  3. 同一目錄下不能有不同包名(沒編譯到的除外);
  4. 同名包,可使用包別名特性解決(比如兩個第三方庫存在同名包);
  5. 同一包(名相同)不能存在多個目錄下(因爲import針對的是目錄,多個時有import包重複聲明問題);
  6. 在一個go源碼文件中,一個包只能有一個import,否則存在包重複聲明問題;
  7. 定義的變量名能和被引用的包名相同;
  8. 變量、函數名、結構體等,如果以小寫字母打頭只能同一包內使用,以大寫打頭則可被其它包使用,可理解爲小寫打頭的爲包私有的,而大寫打頭是共有的;
  9. 結構體變量可以“{}”方式初始化;
  10. GOPATH編譯方式有目錄結構約束,比如需有src目錄;
  11. “go mod”方式編譯沒有目錄結構約束,但注意須在項目根目錄下執行“go mod init <模塊名>”以生成文件“go.mod”;
  12. “go mod”方式的import要帶上模塊名,然後纔是目錄名,沒有包含包名,如:
  1. import "test/hello"中的test爲模塊名,hello爲包文件所在葉子目錄名(不是包名);
  2. import "test/exam/hello"中的test爲模塊名,exam爲父目錄名,hello爲葉子目錄名

 

  1. “go get”下載拉取的文件被房子GOPATH目錄下,如果沒有設置環境變量GOPATH,則執行“go env|grep GOPATH”可查看的GOPATH值,否則以環境變量GOPATH爲準;
  2. 當“go get”不可用時,可以手工下載包;
  3. 當網絡牆原因“go get”不可用時,可考慮使用七牛雲的代理goproxy.cn或者goproxy.io,但通常goproxy.cn更好用;
  4. “go get”設置代理方式(1.13及以上版本):

go env -w GOPROXY=https://goproxy.cn,direct

默認可能是“GOPROXY="https://proxy.golang.org,direct"”,可執行“go env|grep GOPROXY”確認。

  1. 手工下載的包,可在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

  1. 可把命令go看作gcc,使用Makefile組織管理編譯;
  2. 接口interface變量一般定義爲對象,結構體struct變量一般定義爲指針;
  3. 一個結構體只要實現了接口的所以方法,即爲對接口的實現,不需像C++或JAVA那樣顯示指定,也不能顯示指定,這是語法規定(缺點是不方便查找一個接口有哪些實現,一個結構體實現了哪些接口);
  4. JSON字符串可以直接反射爲結構體,反過來也可以;
  5. GO中的string不像C++中std::string,並不支持二進制數據,二進制數據要使用byte類型;
  6. 可調用runtime.GOMAXPROCS設置進程最多佔用的cpu核數;
  7. 可調用runtime.NumCPU得到cpu核數;
  8. 可調用debug.SetMaxThreads設置進程最多啓動的線程數;
  9. 線程對程序是透明的,程序看到的是協程;
  10. go並不直接支持fork調用,但有os.Exec這樣的調用;
  11. 不支持C和C++那樣的隱式類型轉換,即使是整數類型間轉換也需顯示指定;
  12. “:=”方式聲明變量,需保證至少包含一個新變量。

 

附:易遇編譯錯誤

  1. 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那一行刪除。

 

  1. 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,解決辦法是爲目錄增加可執行權限和文件增加可讀權限。

 

  1. 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)互聯網上的依賴的包。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章