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