溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

go語(yǔ)言是如何編譯的

發(fā)布時(shí)間:2020-06-12 19:43:05 來(lái)源:億速云 閱讀:385 作者:鴿子 欄目:編程語(yǔ)言

Go語(yǔ)言中使用 go build 命令主要用于編譯代碼。在包的編譯過(guò)程中,若有必要,會(huì)同時(shí)編譯與之相關(guān)聯(lián)的包。

go build 有很多種編譯方法,如無(wú)參數(shù)編譯、文件列表編譯、指定包編譯等,使用這些方法都可以輸出可執(zhí)行文件。

go build 無(wú)參數(shù)編譯

代碼相對(duì)于 GOPATH 的目錄關(guān)系如下:

.
└── src
   └── chapter11
       └── gobuild
           ├── lib.go
           └── main.go

main.go 代碼如下:

package main

import (
    "fmt"
)

func main() {

    // 同包的函數(shù)
    pkgFunc()

    fmt.Println("hello world")
}

lib.go 代碼如下:

package main
import "fmt"
func pkgFunc() {
    fmt.Println("call pkgFunc")
}

如果源碼中沒(méi)有依賴 GOPATH 的包引用,那么這些源碼可以使用無(wú)參數(shù) go build。格式如下:

go build

在代碼所在目錄(./src/chapter11/gobuild)下使用 go build 命令,如下所示:

$ cd src/chapter11/gobuild/
$ go build
$ ls
gobuild  lib.go  main.go
$ ./gobuild
call pkgFunc
hello world

命令行指令和輸出說(shuō)明如下:

第 1 行,轉(zhuǎn)到本例源碼目錄下。

第 2 行,go build 在編譯開(kāi)始時(shí),會(huì)搜索當(dāng)前目錄的 go 源碼。這個(gè)例子中,go build 會(huì)找到 lib.go 和 main.go 兩個(gè)文件。編譯這兩個(gè)文件后,生成當(dāng)前目錄名的可執(zhí)行文件并放置于當(dāng)前目錄下,這里的可執(zhí)行文件是 go build。

第 3 行和第 4 行,列出當(dāng)前目錄的文件,編譯成功,輸出 go build 可執(zhí)行文件。

第 5 行,運(yùn)行當(dāng)前目錄的可執(zhí)行文件 go build。

第 6 行和第 7 行,執(zhí)行 go build 后的輸出內(nèi)容。

go build+文件列表

編譯同目錄的多個(gè)源碼文件時(shí),可以在 go build 的后面提供多個(gè)文件名,go build 會(huì)編譯這些源碼,輸出可執(zhí)行文件,“go build+文件列表”的格式如下:

go build file1.go file2.go……

在代碼代碼所在目錄(./src/chapter11/gobuild)中使用 go build,在 go build 后添加要編譯的源碼文件名,代碼如下:

$ go build main.go lib.go
$ ls
lib.go  main  main.go
$ ./main
call pkgFunc
hello world
$ go build lib.go main.go
$ ls
lib  lib.go  main  main.go

命令行指令和輸出說(shuō)明如下:

第 1 行在 go build 后添加文件列表,選中需要編譯的 Go 源碼。

第 2  行和第 3 行列出完成編譯后的當(dāng)前目錄的文件。這次的可執(zhí)行文件名變成了 main。

第 4~6 行,執(zhí)行 main 文件,得到期望輸出。

第 7 行,嘗試調(diào)整文件列表的順序,將 lib.go 放在列表的首位。

第 8 行和第 9 行,編譯結(jié)果中出現(xiàn)了 lib 可執(zhí)行文件。

使用“go build+文件列表”方式編譯時(shí),可執(zhí)行文件默認(rèn)選擇文件列表中第一個(gè)源碼文件作為可執(zhí)行文件名輸出。

go build+包

“go build+包”在設(shè)置 GOPATH 后,可以直接根據(jù)包名進(jìn)行編譯,即便包內(nèi)文件被增(加)刪(除)也不影響編譯指令。

1) 代碼位置及源碼

相對(duì)于GOPATH的目錄關(guān)系如下:

.
└── src
   └── chapter11
       └──goinstall
           ├── main.go
           └── mypkg
               └── mypkg.go

main.go代碼如下:

package main
import (
    "chapter11/goinstall/mypkg"
    "fmt"
)
func main() {
    mypkg.CustomPkgFunc()
    fmt.Println("hello world")
}

mypkg.go代碼如下:

package mypkg
import "fmt"
func CustomPkgFunc() {
    fmt.Println("call CustomPkgFunc")
}

2) 按包編譯命令

執(zhí)行以下命令將按包方式編譯 goinstall 代碼:

$ export GOPATH=/home/davy/golangbook/code
$ go build -o main chapter11/goinstall
$ ./goinstall
call CustomPkgFunc
hello world

代碼說(shuō)明如下:

第 1 行,設(shè)置環(huán)境變量 GOPATH,這里的路徑是筆者的目錄,可以根據(jù)實(shí)際目錄來(lái)設(shè)置 GOPATH。

第 2 行,-o執(zhí)行指定輸出文件為 main,后面接要編譯的包名。包名是相對(duì)于 GOPATH 下的 src 目錄開(kāi)始的。

第 3~5 行,編譯成功,執(zhí)行 main 后獲得期望的輸出。

以上就是golang如何編譯的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注億速云其它相關(guān)文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI