最近開始學習Go做嵌入式Linux開發(fā),因此有必要了解一下基礎知識,以幫助我快速入門golang Linux應用開發(fā)。
1、Linux環(huán)境安裝
解壓go環(huán)境并移動到指定目錄
$?tar?-zxvf?go1.15.6.linux-amd64.tar.gz $?mv?go?/usr/local/
創(chuàng)建golang工作空間
$?mkdir?-p??~/golang/{bin,pkg,src}
bin : 目錄包含可執(zhí)行命令pkg : 目錄包含包對象src : 目錄包含go的源文件,它們被組織成包(每個目錄都對應一個包)
配置Go環(huán)境變量
$?vim?.zshrc?或?.bashrc export?GOROOT=/usr/local/go??????????????#?安裝目錄。 export?GOPATH=$HOME/golang?????#?工作環(huán)境 export?GOBIN=$GOPATH/bin???????????#?可執(zhí)行文件存放 export?PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH???????#?添加PATH路徑 $?go?version
2、安裝Vscode插件
首先安裝GO插件:
go?env?-w?GO111MODULE=on go?env?-w?GOPROXY=https://goproxy.io,direct
打開vs code,在命令面板上選擇安裝相應的包:
3、main包和main函數(shù)
所有可執(zhí)行的 Go 程序都必須包含一個 main 函數(shù)。這個函數(shù)是程序運行的入口。main 函數(shù)應該放置于 main 包中。鍵入?go install dirname,編譯程序。該命令會在文件夾內搜索擁有 main 函數(shù)的文件。接下來,它編譯并產生一個名為?dirname?(在 windows 下是 dirname.exe)的二進制文件,該二進制文件放置于工作區(qū)的 bin 文件夾。
4、自定義包
屬于某一個包的源文件都應該放置于一個單獨命名的文件夾里。按照 Go 的慣例,應該****用包名命名該文件夾。
4.1 導入包
為了使用自定義包,我們必須要先導入它。導入自定義包的語法為?import path。我們必須指定自定義包相對于工作區(qū)內?src?文件夾的相對路徑。我們目前的文件夾結構是:
src ????geometry ????????geometry.go ????????rectangle ????????????rectprops.go
import "geometry/rectangle"?這一行會導入 rectangle 包(指定目錄名)。有時候我們導入一個包,只是為了確保它進行了初始化,而無需使用包中的任何函數(shù)或變量。這種情況也可以使用空白標識符_:
package?main? import?( ????_?"geometry/rectangle"?//僅導入,不使用 ) func?main()?{ }
4.2 導出包內符號
在 Go 中,任何以大寫字母開頭的變量或者函數(shù)都是被導出的名字,其它包只能訪問被導出的函數(shù)和變量。
4.3 init函數(shù)
所有包都可以包含一個?init?函數(shù)。init 函數(shù)不應該有任何返回值類型和參數(shù),在我們的代碼中也不能顯式地調用它。init 函數(shù)的形式如下:
func?init()?{??
}
init 函數(shù)可用于執(zhí)行初始化任務,也可用于在開始執(zhí)行之前驗證程序的正確性。包的初始化順序如下:
首先初始化包級別(Package Level)的變量
緊接著調用 init 函數(shù)。包可以有多個 init 函數(shù)(在一個文件或分布于多個文件中),它們按照編譯器解析它們的順序進行調用。
5 go module管理
5.1 導入本地包
上面第二節(jié)是傳統(tǒng)的自定義包和使用的過程,如果開啟了go module功能,上面的步驟就無法編譯通過了。可以通過go env查看配置。如果開啟了go module,需要采用下面新的方式導入自定義本地包:
在被調用文件的目錄下執(zhí)行go mod init,使本目錄變?yōu)橐粋€module,會生成一個go.mod文件
同理,在調用者的目錄下也執(zhí)行go mod init
在調用者目錄,修改go.mod的屬性,指定需要調用的本地包的相對路徑(很重要,不然找不到包)
之后就可以在調用者的源文件中import相應的package name
具體示例如下:有以下目錄結構,被調用者在子目錄,調用者在另一個目錄(位置沒要求,只要在GOPATH中即可,不一定要在父目錄):
>?ls?-R .: 9_use_mymod.go??mymod ./mymod: mymod.go
下面我們需要將兩個目錄都變?yōu)閙odule,在兩個目錄分別執(zhí)行go mod init,生成go.mod文件。下面是兩個源文件的內容:
//9_use_mymod.go?使用自定義的package,并調用函數(shù) package?main import?"mymod"?//調用自定義的包 func?main()?{ ?mymod.SayHi() } //mymod.go?自定義的package,被其他go文件使用 package?mymod import?"fmt" func?SayHi()?{ ?fmt.Println("Hi!?from?package?mymod") }
如果這時候直接編譯,會提示找不到mymod。我們需要在調用者的go.mod文件中設置mymod的具體問題,通過以下命令修改go.mod的配置:
#?go?mod:?-replace=./mymod:?need?old[@v]=new[@w]?(missing?=) go?mod?edit?-replace?mymod=./mymod #?這里設置了mymod的具體位置,使用的相對路徑,也可以設置絕對路徑
之后就可以正常編譯了
6 其他命令
go get url:下載go package,放在src目錄下
go doc package_name [函數(shù)名}:查看包的幫助信息,或具體的函數(shù)信息。我們自己添加的注釋和函數(shù)定義,也可以通過go doc生成,和標準庫中信息差不多
go fmt file:格式化go源文件
編輯:黃飛
?
評論