把命令原始碼檔案中的程式碼拆分到其他程式碼包
我們只關注框出來的2個原始碼檔案
demo5.go
package main
import "flag"
//這裡需要填寫
var name string
func init() {
flag.StringVar(&name, "name", "everyone", "The greeting object.")
}
func main() {
flag.Parse()
hello(name)
}
demo5_lib.go
package lib5 import "fmt" func Hello(name string) { fmt.Printf("Hello, %s!\n", name) }
第一步:
執行命令:go build /jikeshijian/q5/lib
在工作區的pkg目錄中生成了歸檔檔案 linux_amd64/jikeshijian/q5/lib.a
注意了,原始碼檔案demo5.go中的package宣告是lib5,但是這裡生成的歸檔檔名稱是lib.a
首先,我們在構建或者安裝這個程式碼包的時候,提供給go命令的路徑應該是原始碼檔案所在目錄的相對路徑。所以上面我們執行的命令是go build /jikeshijian/q5/lib
而不是go build /jikeshijian/q5/lib5
。
第二步:
在demo5.go中我們註釋的地方填入 import "jikeshijian/q5/lib"
並把對hello()的呼叫改為 lib.Hello()
通過執行go run demo5.go命令試一試
報錯了。
第一處是說我們匯入了jikeshijian/q5/lib
這個包,但是沒有用到它裡面的任何程式實體,這在Go語言是不允許的。編譯時就會報錯。
as lib5
的意思是雖然我們匯入了jikeshijian/q5/lib
這個程式碼包,但是在引用程式實體的時候應該以lib5
作為限定符。這也就是第二個錯誤的原因了,我們用的是lib.Hello()
,限定符用錯了。Go找不到lib.
這個限定符對應的程式碼包。
出現這裡的錯誤的根本原因是:我們在原始碼檔案裡宣告所屬的程式碼包和原始碼檔案所在的目錄的名稱不同。
記住:
原始碼檔案所在的目錄相對於src目錄的相對路徑就是它的程式碼包匯入路徑,而實際使用其程式實體時,所用的限定符要和原始碼檔案裡宣告的程式碼包名稱對應。
修改
我們包demo5_lib.go的所屬程式碼包改為lib。理由是:我們總是應該讓宣告的包名和其父目錄的名稱一致。
重新編譯demo5_lib.go,然後執行如下命令
執行成功。我已經學會了把命令原始碼檔案中的程式碼拆分到其他程式碼包。