中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Go基礎(chǔ)中如何構(gòu)建go程序-創(chuàng)新互聯(lián)

這篇文章的內(nèi)容主要圍繞Go基礎(chǔ)中如何構(gòu)建go程序進(jìn)行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!

成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元烏翠做網(wǎng)站,已為上家服務(wù),為烏翠各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

hello world

從一個(gè)簡單的程序開始解釋,將下面的內(nèi)容放進(jìn)test.go文件中,路徑隨意:

package main import ( "fmt" ) func main() {    fmt.Println("Hello World")}

Go通過包的方式管理程序,每個(gè)Go源代碼文件都必須聲明自己所在的包,正如上面的package main聲明自己所在的包是main包。

每個(gè)程序都必須有一個(gè)main包,main包作為整個(gè)程序的編譯入口包,main包中的main()函數(shù)作為程序的執(zhí)行入口。

import關(guān)鍵字用來導(dǎo)入其它包,導(dǎo)入某個(gè)包之后就能在當(dāng)前文件中使用這個(gè)包中的函數(shù),例如上面的main包導(dǎo)入fmt包后,可以使用fmt包中的函數(shù)Println()。

然后可以使用go的build工具編譯這個(gè)test.go文件:

$ go build test.go

編譯后,將在當(dāng)前路徑下生成一個(gè)可執(zhí)行二進(jìn)制文件:Windows下生成的是test.exe文件,Unix下生成的是test文件。既然是可執(zhí)行文件,當(dāng)然可以直接執(zhí)行:

$ ./test

將輸出"Hello World"。

也可以直接通過go的run工具將編譯和運(yùn)行兩個(gè)步驟合二為一:

2$ go run test.go Hello World

go run不會生成可執(zhí)行的二進(jìn)制文件,它實(shí)際上是將編譯得到的文件放進(jìn)一個(gè)臨時(shí)目錄,然后執(zhí)行,執(zhí)行完后自動清理臨時(shí)目錄。

關(guān)于包和go文件

每個(gè)go代碼文件只能且必須使用package語句聲明一個(gè)包,也就是說一個(gè)文件中不能包含多個(gè)包。

Go中有兩種類型的包,或者說有兩種類型的文件:

  1. 編譯后成為可執(zhí)行文件的包,也就是main包編譯后的得到的文件


  2. 編譯后成為共享庫的包,只要go程序文件中聲明的不是main包,就是庫文件

注意:
在go的官方文檔中將go的二進(jìn)制可執(zhí)行程序稱為命令,有時(shí)候還會將go的源代碼文件稱為命令的源文件??蓤?zhí)行程序和包相反,包一般是作為"庫"文件存在,用于導(dǎo)入而非用于執(zhí)行

共享庫中包含一些函數(shù),這些函數(shù)比較通用,所以放進(jìn)共享庫方便函數(shù)復(fù)用。例如fmt包中的Println函數(shù),到處都在使用這個(gè)函數(shù),且因?yàn)閒mt包是標(biāo)準(zhǔn)庫(Standary library),無論是誰都可以去使用這個(gè)包。

有兩種類型的庫文件:標(biāo)準(zhǔn)庫和第三方的庫。標(biāo)準(zhǔn)庫是隨Go安裝的時(shí)候放在go安裝目錄下的($GOROOT/src/),第三方庫是放在workspace下的。關(guān)于workspace后文再說。

共享庫可以被import導(dǎo)入(例如fmt包)。由于導(dǎo)入操作是在編譯期間實(shí)現(xiàn)的,共享庫中不應(yīng)該包含任何輸出型語句。

Go中對庫文件要求比較嚴(yán)格,或者說強(qiáng)制性的規(guī)范。它要求庫文件中package聲明的包名必須和目錄名稱相同,且同一個(gè)目錄下只允許有一個(gè)包,但同一個(gè)目錄下可以有多個(gè)庫文件片段,只不過這些庫文件中必須都使用package聲明它的包名為目錄名。例如:

src/mycode

|- first.go |- second.go |- third.go

如果這三個(gè)文件都是庫文件,則它們都必須且只能使用package mycode聲明自己的包為mycode。go build的時(shí)候,會將它們合并起來。如果聲明的包名不是mycode,go build會直接忽略它。

當(dāng)然,對main包就無所謂了,它不是庫文件,可以放在任何地方,對目錄名沒有要求。但如果使用go install,則有額外的要求,見后文。

庫文件中的大小寫命名

Go通過名稱首字母的大小寫決定屬性是否允許導(dǎo)出:

首字母大寫的屬性是允許導(dǎo)出的屬性首字母小寫的屬性不允許被導(dǎo)出

所以當(dāng)庫文件被導(dǎo)入時(shí),只有這個(gè)庫文件中以大寫字母開頭的常量、變量、函數(shù)等才會被導(dǎo)出,才可以在其他文件中使用。

例如,庫文件abc.go中:

2func first() {} func Second() {}

當(dāng)導(dǎo)入這個(gè)包的時(shí)候,由于first()函數(shù)首字母小寫,外界無法使用它,它只能在自己的包abc.go中使用,對外界不可見。大寫字母開頭的Second()函數(shù)會被導(dǎo)入,所以可用。

工作空間(workspace)

速覽

通過環(huán)境變量GOPATH設(shè)置workspace的路徑Go編程人員一般將它們的Go代碼放在一個(gè)workspace下,當(dāng)然,這不是必須的workspace包含一個(gè)或多個(gè)版本控制系統(tǒng)的倉庫(如git)每個(gè)倉庫包含一個(gè)或多個(gè)package每個(gè)package由單個(gè)目錄下的一個(gè)或多個(gè)Go源文件組成,它們都必須聲明目錄名作為它們的包名package的目錄路徑?jīng)Q定導(dǎo)入包時(shí)import的路徑

Go和其它編程語言在組織項(xiàng)目的時(shí)候有所不同,其它語言一般每個(gè)項(xiàng)目都有一個(gè)單獨(dú)的workspace,且workspace一般和版本控制倉庫進(jìn)行綁定。

現(xiàn)在設(shè)置GOPATH環(huán)境變量,假設(shè)設(shè)置為/gocode

echo 'export GOPATH=/gocode' >>/etc/profile.d/gopath.sh

chmod +x /etc/profile.d/gopath.shsource /etc/profile.d/gopath.sh

go env GOPATH確定是否正確:

$ go env GOPATH /gocode

workspace目錄結(jié)構(gòu)

每個(gè)workspace都是一個(gè)目錄,這個(gè)目錄下至少包含三個(gè)目錄:

src:該目錄用于存放Go源代碼文件(也稱為命令的源文件)bin:該目錄用于存放可執(zhí)行命令(即構(gòu)建后可執(zhí)行的二進(jìn)制go程序,也稱為命令文件)pkg:該目錄用于存放共享庫文件(即構(gòu)建后非可執(zhí)行程序的庫包,也稱為包對象文件)

括號中給的名稱是go官方文檔中常見的別名稱呼。

所以,先創(chuàng)建這3個(gè)目錄

mkdir -p /gocode/{src,pkg,bin}

GOPATH和GOROOT環(huán)境變量

GOPATH環(huán)境變量指定workspace的位置,用來指示go從哪里搜索go源文件/包,例如import時(shí)從哪個(gè)路徑搜索包并導(dǎo)入。GOROOT環(huán)境變量用于指定go的安裝位置。go需要導(dǎo)入包時(shí),會從GOPATH和GOROOT所設(shè)置的位置處搜索包。

默認(rèn)位置為$HOME/go(Unix)或%USERPROFILE\go%(Windows)??梢允謩釉O(shè)置GOPATH環(huán)境變量的路徑從而指定workspace的位置,可以指定為多個(gè)目錄,多個(gè)目錄時(shí)使用冒號分隔目錄(Unix系統(tǒng))或使用分號分隔目錄(Windows系統(tǒng))。注意,絕對不能將其設(shè)置為go的安裝目錄,即不能和GOROOT環(huán)境變量重復(fù)。

例如,windows下設(shè)置d:\gocode目錄為GOPATH的路徑:

setx GOPATH d:\gocode

Unix下設(shè)置$HOME/gocode目錄為GOPATH的路徑:

mkdir ~/gocode export GOPATH=~/gocode echo 'GOPATH=~/gocode' >>~/.bashrc

go env或go env GOPATH命令可以輸出當(dāng)前有效的GOPATH路徑。

$ go env | grep GOPATH GOPATH="/root/gocode"  $ go env GOPATH /root/gocode

go build

先寫兩個(gè)go文件,一個(gè)是可執(zhí)行g(shù)o文件test.go,一個(gè)是共享庫strutils.go,將它們放在workspace的src下。

$ mkdir -p $GOPATH/src/{hello,strutils} $ tree -C .├── bin├── pkg├── src│ ├── hello│ │ └── test.go│ └── strutils│     └── strutils.go

注意,上面故意將test.go放在名為hello的目錄下,可以將其放在src下的任何非庫文件目錄下(例如不能放進(jìn)strutils目錄下),名稱不要求。

hello/test.go的內(nèi)容如下:

package main import ( "fmt" "strutils" ) func main() {    fmt.Println("Hello World")    fmt.Println(strutils.ToUpperCase("hello world"))}

strutils/strutils.go的內(nèi)容如下:

package strutils import ( "strings" ) func ToUpperCase(s string) string{ return strings.ToUpper(s)} func ToLowerCase(s string) string{ return strings.ToLower(s)}

go build可以用于編譯,編譯時(shí)會對import導(dǎo)入的包進(jìn)行搜索,搜索的路徑為標(biāo)準(zhǔn)庫所在路徑$GOROOT/src、workspace下的src目錄。它只會生成額外的可執(zhí)行文件放在當(dāng)前目錄下,不會生成額外的庫文件。但需要注意,生成的可執(zhí)行文件名稱可能會出乎意料:

例如進(jìn)入到目錄src/hello下,對test.go的文件進(jìn)行編譯,以下三種build路徑都可用成功編譯:

cd src/hello go build

# 生成的可執(zhí)行文件名為hello go build .

# 生成的可執(zhí)行文件名為hello go build test.go

# 生成的可執(zhí)行文件名為test

前兩者是等價(jià)的,當(dāng)go build以目錄的形式進(jìn)行編譯,則生成的可執(zhí)行文件名為目錄名。當(dāng)go build以go代碼文件名的方式進(jìn)行編譯,則生成的可執(zhí)行程序名為go源碼文件名(去掉后綴.go或增加后綴.exe)。

go install

go還有一個(gè)工具install,go install的操作稱為安裝,將文件安裝到合適的位置。go install時(shí)會先進(jìn)行編譯,然后將編譯后的二進(jìn)制文件保存到workspace的bin目錄下,將編譯后的庫文件(稱為包對象文件,以".a"為后綴)放在pkg目錄下。

注意,go install時(shí)必須先進(jìn)入到$GOPATH/src下,且只能對目錄進(jìn)行操作,不能對具體的go文件操作,因?yàn)間o認(rèn)為包和目錄名相同。給go install指定一個(gè)目錄名,就表示編譯這個(gè)包名。

例如,對src/hello下的test.go進(jìn)行安裝,由于它導(dǎo)入了strutils包,所以會自動將strutils也安裝好:

$ cd $GOPATH/src $ go install hello $ tree $GOPATH /gocode├── bin│ └── hello           # 二進(jìn)制程序文件名為hello,而非test├── pkg│ └── linux_amd64     │     └── strutils.a  # 庫文件└── src    ├── hello    │ └── test.go    └── strutils        └── strutils.go

還可以單獨(dú)對庫文件進(jìn)行安裝:

$ rm -rf $GOPATH/bin/* $GOPATH/pkg/* $ cd $GOPATH/src $ go install strutils /gocode├── bin├── pkg│ └── linux_amd64│     └── strutils.a└── src    ├── hello    │ └── test.go    └── strutils        └── strutils.go

如果省略目錄名,則表示對當(dāng)前目錄下的包進(jìn)行安裝:

$ cd $GOPATH/src/hello $ go install

再次提醒,go install前先進(jìn)入到$GOPATH/src目錄下。

由于go install可以直接安裝二進(jìn)制文件到$GOPATH/bin,所以出于方便執(zhí)行這些二進(jìn)制程序,可以將這個(gè)目錄放進(jìn)PATH環(huán)境變量。

$ export PATH=$PATH:`go env GOPATH`/bin

構(gòu)建go程序的規(guī)范建議

1.由于可以將所有g(shù)o項(xiàng)目放在同一個(gè)$GOPATH目錄下,為了區(qū)分src下的項(xiàng)目目錄和庫文件目錄,建議將每個(gè)項(xiàng)目目錄設(shè)置深一點(diǎn)。

例如:

binpkgsrc |- /first/project            |- main.go |- myliba                |- a.go |- b.go |- mylibb                |- c.go |- d.go |- /second/project            |- main.go |- lib                |- a.go |- b.go

2.go install時(shí),先進(jìn)入到項(xiàng)目目錄下。

3.庫文件的名稱(也是目錄名)要選取合理,盡量短,但卻盡量見名知意,也盡量減少名稱重復(fù)的幾率。

例如util這種名稱到處都是,可以修改為numutil、nameutil等。

什么是go

go是golang的簡稱,golang 是Google開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能。

感謝你的閱讀,相信你對“Go基礎(chǔ)中如何構(gòu)建go程序”這一問題有一定的了解,快去動手實(shí)踐吧,如果想了解更多相關(guān)知識點(diǎn),可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站!小編會繼續(xù)為大家?guī)砀玫奈恼拢?/p>

新聞名稱:Go基礎(chǔ)中如何構(gòu)建go程序-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://www.rwnh.cn/article40/hsjeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、定制開發(fā)、標(biāo)簽優(yōu)化、品牌網(wǎng)站制作、軟件開發(fā)App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
岫岩| 福州市| 广南县| 巴彦淖尔市| 高台县| 安远县| 扬州市| 尼玛县| 连江县| 鄂温| 南昌市| 海淀区| 苗栗市| 石楼县| 三门峡市| 德清县| 南木林县| 阿拉善右旗| 城固县| 英德市| 延长县| 汽车| 安多县| 汶上县| 临高县| 宜城市| 靖远县| 海门市| 句容市| 江口县| 乌兰县| 海城市| 华阴市| 宁安市| 杭锦后旗| 丰顺县| 枞阳县| 安福县| 新乡市| 鄯善县| 伊金霍洛旗|