文章目錄
- 一、命令原始碼檔案
- 1.1命令原始碼檔案介紹
- 1.2 自定義命令原始碼檔案的引數使用說明
- 二、庫原始碼檔案
- 2.1 庫原始碼檔案介紹
- 2.2 如何將命令原始碼檔案拆分到其他庫檔案
- 三、總結
原始碼檔案分為三種,即:命令原始碼檔案、庫原始碼檔案和測驗原始碼檔案,
命令原始碼檔案
- 獨立程式入口
- 屬于main包,包含無引數無結果的main函式
- 通過go run命令運行,可接受命令列引數
- main函式執行的結束以為當前程式運行結束
- 同一個代碼包中不要放多個命令原始碼檔案
- 命令原始碼檔案與庫原始碼檔案不要放在同一個代碼包
- 構建后生成可執行檔案,位于命令執行目錄
- 安裝后生成可執行檔案,位于當前作業區的bin子目錄或gobin包含的目錄
庫原始碼檔案
- 專門用于放置可供其他代碼使用的程式物體
- 構建后只生產臨時檔案,位于作業系統臨時目錄下,作用在于檢查和驗證
- 安裝后生成歸檔檔案,位于當前作業區的pkg子目錄,即靜態鏈接庫檔案
測驗原始碼檔案
- 功能測驗原始碼檔案
- 性能基準測驗原始碼檔案
- 示例測驗原始碼檔案
一、命令原始碼檔案
1.1命令原始碼檔案介紹
命令原始碼檔案是程式的運行入口,如果一個原始碼下載檔案宣告屬于main包,并且包含一個無引數宣告且無結果宣告的main函式,那么它就是命令原始碼檔案,
package main
import (
//flag包用于接收和決議命令引數
"flag"
//fmt包含有格式化I/O函式
"fmt"
)
var name string
func init() {
flag.StringVar(&name, "name", "everyone", "The greeting object.")
//第 1 個引數是用于存盤該命令引數值的地址
//第 2 個引數是為了指定該命令引數的名稱
//第 3 個引數是為了指定在未追加該命令引數時的默認值
//第 4 個函式引數,即是該命令引數的簡短說明
}
func main() {
//函式flag.Parse用于真正決議命令引數,并把它們的值賦給相應的變數;對該函式的呼叫必須在所有命令引數存盤載體的宣告和設定之后,并且在讀取任何命令引數值之前進行,
flag.Parse()
fmt.Printf("Hello, %s!\n", name)
}
[root@zijie workspace]# go run demo1.go -name="Zijie"
Hello, Zijie!
[root@zijie workspace]# go run demo1.go --help
//go run命令構建上述命令原始碼檔案時臨時生成的可執行檔案的完整路徑,
Usage of /tmp/go-build990272550/b001/exe/demo1:
-name string
The greeting object. (default "everyone")
[root@zijie workspace]# go build demo1.go
[root@zijie workspace]# ./demo1 --help
Usage of ./demo1:
-name string
The greeting object. (default "everyone")
1.2 自定義命令原始碼檔案的引數使用說明
??對變數flag.Usage重新賦值,flag.Usage的型別是func(),即一種無引數宣告且無結果宣告的函式型別,
package main
import (
"flag"
"fmt"
"os"
)
var name string
// 方式3:創建一個私有的命令引數容器,不用全域的flag.CommandLine變數,把對flag.StringVar的呼叫替換為對cmdLine.StringVar呼叫,再把flag.Parse()替換為cmdLine.Parse(os.Args[1:]),其中的os.Args[1:]指的就是我們給定的那些命令引數,這樣做就完全脫離了flag.CommandLine,
//var cmdLine = flag.NewFlagSet("question", flag.ExitOnError)
func init() {
// 方式2:在呼叫flag包中的一些函式(比如StringVar、Parse等等)的時候,實際上是在呼叫flag.CommandLine變數的對應方法,flag.CommandLine相當于默認情況下的命令引數容器,所以,通過對flag.CommandLine重新賦值,我們可以更深層次地定制當前命令原始碼檔案的引數使用說明,flag.PanicOnError和flag.ExitOnError都是預定義在flag包中的常量,flag.ExitOnError的含義是,告訴命令引數容器,當命令后跟--help或者引數設定的不正確的時候,在列印命令引數使用說明后以狀態碼2結束當前程式,狀態碼2代表用戶錯誤地使用了命令,而flag.PanicOnError與之的區別是在最后拋出“運行時恐慌(panic)”,
//flag.CommandLine = flag.NewFlagSet("", flag.PanicOnError)
flag.CommandLine = flag.NewFlagSet("", flag.ExitOnError)
flag.CommandLine.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of %s:\n", "question")
flag.PrintDefaults()
}
// 方式3,
//cmdLine.StringVar(&name, "name", "everyone", "The greeting object.")
flag.StringVar(&name, "name", "everyone", "The greeting object.")
}
func main() {
// 方式1:對變數flag.Usage重新賦值,flag.Usage的型別是func(),即一種無引數宣告且無結果宣告的函式型別,對flag.Usage的賦值必須在呼叫flag.Parse函式之前,
//flag.Usage = func() {
// fmt.Fprintf(os.Stderr, "Usage of %s:\n", "question")
// flag.PrintDefaults()
//}
// 方式3,
//cmdLine.Parse(os.Args[1:])
flag.Parse()
fmt.Printf("Hello, %s!\n", name)
}
二、庫原始碼檔案
2.1 庫原始碼檔案介紹
??庫原始碼檔案是不能被直接運行的原始碼檔案,它僅用于存放程式物體,這些程式物體可以被其他代碼使用(遵從 Go 語言規范)
??在 Go 語言中,程式物體是變數、常量、函式、結構體和介面的統稱,我們總是會先宣告(或者說定義)程式物體,然后再去使用,程式物體的名字被統稱為識別符號,識別符號可以是任何 Unicode 編碼可以表示的字母字符、數字以及下劃線“_”,但是其首字母不能是數字,
2.2 如何將命令原始碼檔案拆分到其他庫檔案
命令原始碼檔案
package main
import (
//flag包用于接收和決議命令引數
"flag"
//fmt包含有格式化I/O函式
"fmt"
)
var name string
func init() {
flag.StringVar(&name, "name", "everyone", "The greeting object.")
//第 1 個引數是用于存盤該命令引數值的地址
//第 2 個引數是為了指定該命令引數的名稱
//第 3 個引數是為了指定在未追加該命令引數時的默認值
//第 4 個函式引數,即是該命令引數的簡短說明
}
func main() {
//函式flag.Parse用于真正決議命令引數,并把它們的值賦給相應的變數;對該函式的呼叫必須在所有命令引數存盤載體的宣告和設定之后,并且在讀取任何命令引數值之前進行,
flag.Parse()
fmt.Printf("Hello, %s!\n", name)
}
拆分主體
package main
import (
"flag"
)
var name string
func init() {
flag.StringVar(&name, "name", "everyone", "The greeting object.")
}
func main() {
flag.Parse()
hello(name)
}
拆分hellow函式
package main
import "fmt"
func hello(name string) {
fmt.Printf("Hello, %s!\n", name)
}
[root@zijie bin]# ll /root/workspace/src/puzzlers/article3/q1/
總用量 8.0K
-rw-r--r-- 1 root root 182 3月 5 10:18 demo1.go
-rw-r--r-- 1 root root 91 3月 5 10:19 demo1_lib.go
[root@zijie bin]# go build puzzlers/article3/q1
[root@zijie bin]# ls
q1
[root@zijie bin]# ./q1
Hello, everyone!
[root@zijie bin]# ./q1 --name="zijie"
Hello, zijie!
三、總結
- 同目錄下的原始碼檔案的代碼包宣告陳述句要一致
- 原始碼檔案宣告的代碼包的名稱可以與其所在的目錄的名稱不同
- 原始碼檔案所在的目錄相對于 src 目錄的相對路徑就是它的代碼包匯入路徑,而實際使用其程式物體時給定的限定符要與它宣告所屬的代碼包名稱對應
- 為了不讓該代碼包的使用者產生困惑,我們總是應該讓宣告的包名與其父目錄的名稱一致
- 名稱的首字母為大寫的程式物體才可以被當前包外的代碼參考,否則它就只能被當前包內的其他代碼參考,通過名稱,Go 語言自然地把程式物體的訪問權限劃分為了包級私有的和公開的,
- 在 Go 1.5 及后續版本中,我們可以通過創建internal代碼包讓一些程式物體僅僅能被當前模塊中的其他代碼參考,這被稱為 Go 程式物體的第三種訪問權限:模塊級私有,具體規則是,internal代碼包中宣告的公開程式物體僅能被該代碼包的直接父包及其子包中的代碼參考,當然,參考前需要先匯入這個internal包,對于其他代碼包,匯入該internal包都是非法的,無法通過編譯,
本文內容來自Go語言核心36講
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266759.html
標籤:其他
