咱們只關注框出來的2個源碼文件linux
demo5.goui
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.go3d
package lib5 import "fmt" func Hello(name string) { fmt.Printf("Hello, %s!\n", name) }
執行命令:go build /jikeshijian/q5/libcode
在工做區的pkg目錄中生成了歸檔文件 linux_amd64/jikeshijian/q5/lib.ablog
注意了,源碼文件demo5.go中的package聲明是lib5,可是這裏生成的歸檔文件名稱是lib.a源碼
首先,咱們在構建或者安裝這個代碼包的時候,提供給go命令的路徑應該是源碼文件所在目錄的相對路徑。因此上面咱們執行的命令是go build /jikeshijian/q5/lib
而不是go build /jikeshijian/q5/lib5
。string
在demo5.go中咱們註釋的地方填入 import "jikeshijian/q5/lib"
it
並把對hello()的調用改成 lib.Hello()
編譯
經過運行go run demo5.go命令試一試import
報錯了。
第一處是說咱們導入了jikeshijian/q5/lib
這個包,可是沒有用到它裏面的任何程序實體,這在Go語言是不容許的。編譯時就會報錯。
as lib5
的意思是雖然咱們導入了jikeshijian/q5/lib
這個代碼包,可是在引用程序實體的時候應該以lib5
做爲限定符。這也就是第二個錯誤的緣由了,咱們用的是lib.Hello()
,限定符用錯了。Go找不到lib.
這個限定符對應的代碼包。
出現這裏的錯誤的根本緣由是:咱們在源碼文件裏聲明所屬的代碼包和源碼文件所在的目錄的名稱不一樣。
源碼文件所在的目錄相對於src目錄的相對路徑就是它的代碼包導入路徑,而實際使用其程序實體時,所用的限定符要和源碼文件裏聲明的代碼包名稱對應。
咱們包demo5_lib.go的所屬代碼包改成lib。理由是:咱們老是應該讓聲明的包名和其父目錄的名稱一致。
從新編譯demo5_lib.go,而後執行以下命令
運行成功。我已經學會了把命令源碼文件中的代碼拆分到其餘代碼包。