首頁  >  文章  >  後端開發  >  go語言中build指令怎麼用

go語言中build指令怎麼用

青灯夜游
青灯夜游原創
2023-01-17 13:52:123548瀏覽

在go語言中,「go build」命令主要用於編譯程式碼,可以將Go語言程式碼編譯成二進位的可執行文件,但是需要手動執行該二進位檔案。 「go build」有很多種編譯方法,如無參數編譯、檔案清單編譯、指定套件編譯等,使用這些方法都可以輸出執行檔。

go語言中build指令怎麼用

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

Go語言是編譯型的靜態語言(和C語言一樣),所以在執行Go語言程式之前,先要將其編譯成二進位的可執行檔。

可以透過Go語言提供的go buildgo run指令對Go語言程式進行編譯:

  • go build指令可以將Go語言程式碼編譯成二進位的可執行文件,但是需要我們手動執行該二進位檔案;

  • ##go run指令則比較方便,它會在編譯後直接執行Go語言程序,編譯過程會產生一個臨時文件,但不會產生可執行文件,這個特點很適合用來除錯程式。

go build指令(go語言編譯指令)

Go語言中使用go build 指令主要用於編譯代碼。在套件的編譯過程中,若有必要,會同時編譯與之相關聯的套件。

go build 有許多種編譯方法,例如無參數編譯、檔案清單編譯、指定套件編譯等,使用這些方法都可以輸出執行檔。

go build 無參數編譯

本小節需要用到的程式碼具體位置是

./src/chapter11/gobuild

程式碼相對於GOPATH 的目錄關係如下:

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

main.go 程式碼如下:

package main

import (
    "fmt"
)

func main() {
    // 同包的函数
    pkgFunc()
    fmt.Println("hello world")
}

lib.go 程式碼如下:

package main

import "fmt"

func pkgFunc() {
    fmt.Println("call pkgFunc")
}

如果原始碼中沒有依賴GOPATH 的套件引用,那麼這些原始碼可以使用無參數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

命令列指令和輸出說明如下:

  • 第1 行,到本例原始碼目錄下。

  • 第 2 行,go build 在編譯開始時,會搜尋目前目錄的 go 原始碼。這個範例中,go build 會找到 lib.go 和 main.go 兩個檔案。編譯這兩個檔案後,產生目前目錄名的可執行檔並放置在目前目錄下,這裡的可執行檔是 go build。

  • 第 3 行和第 4 行,列出目前目錄的文件,編譯成功,輸出 go build 執行檔。

  • 第 5 行,執行目前目錄的可執行檔 go build。

  • 第 6 行和第 7 行,執行 go build 後的輸出內容。

go build 檔案清單

#編譯同目錄的多個原始碼檔案時,可以在go build 的後面提供多個檔案名, go build 會編譯這些原始碼,輸出可執行文件,「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

命令列指令與輸出說明如下:

  • 第1 行在go build 後面新增檔案列表,選取需要編譯的Go 原始碼。

  • 第 2  行和第 3 行列出完成編譯後的目前目錄的檔案。這次的可執行檔名變成了 main。

  • 第 4~6 行,執行 main 文件,得到期望輸出。

  • 第 7 行,嘗試調整檔案清單的順序,將 lib.go 放在清單的首位。

  • 第 8 行和第 9 行,編譯結果出現了 lib 執行檔。

提示:

使用「

go build 檔案清單」方式編譯時,執行檔預設選擇檔案清單中第一個原始碼文件作為可執行檔名輸出。

如果需要指定輸出可執行檔名,可以使用

-o參數,請參考下面的範例:

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

上面程式碼中,在go build 和檔案清單之間插入了

-o myexec參數,表示指定輸出檔名為myexec。

注意:

使用「go build 檔案清單」編譯方式編譯時,檔案清單中的每個檔案必須是同一個套件的 Go 原始碼。也就是說,不能像 C 一樣將所有工程的 Go 原始碼使用檔案列表方式進行編譯。編譯複雜工程時需要用「指定包編譯」的方式。

go build 檔案清單」方式更適合使用Go語言寫的只有少量檔案的工具。

go build 套件

「go build 套件」在設定GOPATH 後,可以直接根據套件名稱進行編譯,即使封包內檔案被增加(加)刪(除)也不影響編譯指令。

1) 程式碼位置及原始碼

本小节需要用到的代码具体位置是./src/chapter11/goinstall。

本套教程所有源码下载地址:https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ    提取密码:hfyf

相对于GOPATH的目录关系如下:

.
└── 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) 按包编译命令

执行以下命令将按包方式编译 goinstall 代码:

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

代码说明如下:

  • 第 1 行,设置环境变量 GOPATH,这里的路径是笔者的目录,可以根据实际目录来设置 GOPATH。

  • 第 2 行,-o执行指定输出文件为 main,后面接要编译的包名。包名是相对于 GOPATH 下的 src 目录开始的。

  • 第 3~5 行,编译成功,执行 main 后获得期望的输出。

go build 编译时的附加参数

go build 还有一些附加参数,可以显示更多的编译信息和更多的操作,详见下表所示。

go build编译时的附加参数
附加参数 备  注
-v 编译时显示包名
-p n 开启并发编译,默认情况下该值为 CPU 逻辑核数
-a 强制重新构建
-n 打印编译时会用到的所有命令,但不真正执行
-x 打印编译时会用到的所有命令
-race 开启竞态检测

表中的附加参数按使用频率排列,读者可以根据需要选择使用。

【相关推荐:Go视频教程编程教学

以上是go語言中build指令怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn