久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Go基礎中如何構建go程序

163次閱讀
沒有評論

共計 5290 個字符,預計需要花費 14 分鐘才能閱讀完成。

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

hello world

從一個簡單的程序開始解釋,將下面的內容放進 test.go 文件中,路徑隨意:

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

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

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

import 關鍵字用來導入其它包,導入某個包之后就能在當前文件中使用這個包中的函數,例如上面的 main 包導入 fmt 包后,可以使用 fmt 包中的函數 Println()。

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

$ go build test.go

編譯后,將在當前路徑下生成一個可執行二進制文件:Windows 下生成的是 test.exe 文件,Unix 下生成的是 test 文件。既然是可執行文件,當然可以直接執行:

$ ./test

將輸出 Hello World。

也可以直接通過 go 的 run 工具將編譯和運行兩個步驟合二為一:

2$ go run test.go Hello World

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

關于包和 go 文件

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

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

編譯后成為可執行文件的包,也就是 main 包編譯后的得到的文件

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

注意:
在 go 的官方文檔中將 go 的二進制可執行程序稱為命令,有時候還會將 go 的源代碼文件稱為命令的源文件。可執行程序和包相反,包一般是作為 庫 文件存在,用于導入而非用于執行

共享庫中包含一些函數,這些函數比較通用,所以放進共享庫方便函數復用。例如 fmt 包中的 Println 函數,到處都在使用這個函數,且因為 fmt 包是標準庫(Standary library),無論是誰都可以去使用這個包。

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

共享庫可以被 import 導入(例如 fmt 包)。由于導入操作是在編譯期間實現的,共享庫中不應該包含任何輸出型語句。

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

src/mycode

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

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

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

庫文件中的大小寫命名

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

首字母大寫的屬性是允許導出的屬性首字母小寫的屬性不允許被導出

所以當庫文件被導入時,只有這個庫文件中以大寫字母開頭的常量、變量、函數等才會被導出,才可以在其他文件中使用。

例如,庫文件 abc.go 中:

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

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

工作空間 (workspace) 速覽

通過環境變量 GOPATH 設置 workspace 的路徑 Go 編程人員一般將它們的 Go 代碼放在一個 workspace 下,當然,這不是必須的 workspace 包含一個或多個版本控制系統的倉庫 (如 git) 每個倉庫包含一個或多個 package 每個 package 由單個目錄下的一個或多個 Go 源文件組成,它們都必須聲明目錄名作為它們的包名 package 的目錄路徑決定導入包時 import 的路徑

Go 和其它編程語言在組織項目的時候有所不同,其它語言一般每個項目都有一個單獨的 workspace,且 workspace 一般和版本控制倉庫進行綁定。

現在設置 GOPATH 環境變量,假設設置為 /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 目錄結構

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

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

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

所以,先創建這 3 個目錄

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

GOPATH 和 GOROOT 環境變量

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

默認位置為 $HOME/go(Unix)或 %USERPROFILE\go%(Windows)。可以手動設置 GOPATH 環境變量的路徑從而指定 workspace 的位置,可以指定為多個目錄,多個目錄時使用冒號分隔目錄 (Unix 系統) 或使用分號分隔目錄(Windows 系統)。注意,絕對不能將其設置為 go 的安裝目錄,即不能和 GOROOT 環境變量重復。

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

setx GOPATH d:\gocode

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

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

go env 或 go env GOPATH 命令可以輸出當前有效的 GOPATH 路徑。

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

go build

先寫兩個 go 文件,一個是可執行 go 文件 test.go,一個是共享庫 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 下的任何非庫文件目錄下(例如不能放進 strutils 目錄下),名稱不要求。

hello/test.go 的內容如下:

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

strutils/strutils.go 的內容如下:

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

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

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

cd src/hello go build

# 生成的可執行文件名為 hello go build .

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

# 生成的可執行文件名為 test

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

go install

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

注意,go install 時必須先進入到 $GOPATH/src 下,且只能對目錄進行操作,不能對具體的 go 文件操作,因為 go 認為包和目錄名相同。給 go install 指定一個目錄名,就表示編譯這個包名。

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

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

還可以單獨對庫文件進行安裝:

$ 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

如果省略目錄名,則表示對當前目錄下的包進行安裝:

$ cd $GOPATH/src/hello $ go install

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

由于 go install 可以直接安裝二進制文件到 $GOPATH/bin,所以出于方便執行這些二進制程序,可以將這個目錄放進 PATH 環境變量。

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

構建 go 程序的規范建議

1. 由于可以將所有 go 項目放在同一個 $GOPATH 目錄下,為了區分 src 下的項目目錄和庫文件目錄,建議將每個項目目錄設置深一點。

例如:

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 時,先進入到項目目錄下。

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

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

什么是 go

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

感謝你的閱讀,相信你對“Go 基礎中如何構建 go 程序”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關知識點,可以關注丸趣 TV 網站!丸趣 TV 小編會繼續為大家帶來更好的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計5290字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 叶城县| 南丰县| 周口市| 涞水县| 临夏市| 临沭县| 洱源县| 东乌| 盈江县| 墨竹工卡县| 永寿县| 时尚| 合作市| 全南县| 北辰区| 比如县| 新化县| 尚志市| 贡嘎县| 塔河县| 疏勒县| 密山市| 临湘市| 灵寿县| 井冈山市| 玛多县| 湘潭县| 比如县| 安国市| 南涧| 临江市| 安吉县| 定安县| 璧山县| 岫岩| 英山县| 龙门县| 苏州市| 二手房| 腾冲县| 剑阁县|