庫原始碼檔案:
不能被直接執行的原始碼檔案,它僅用於存放程式實體,這些程式實體可以被其他**使用。
**包宣告的基本規則:
1. 同目錄下的原始碼檔案的**包宣告語句要一致。也就是說,它們要同屬於乙個**包(package)。這對於所有原始碼檔案都是適用的。
如果目錄中有命令原始碼檔案,那麼其他種類的原始碼檔案也應該宣告屬於main包。這也是能夠成功構建執行它們的前提。
2. 原始碼檔案宣告的**包的名稱可以與其所在的目錄的名稱不同。在針對**包進行構建時,生成的結果檔案的主名稱與其父目錄的名稱一致。
對於命令原始碼檔案,構建生成可執行檔案的主名稱會與其父目錄的名稱相同。
面試題:
1. 如何拆分命令原始碼檔案到其他**包?
1在該命令原始碼檔案中,增加了匯入lib包,同時修改了main()函式。2package main34
import (5"
36class/q5/lib"6
"flag"7
)89var studentname string
1011
func init()
1415
func main()
再看下**包檔案:q5/lib/demo5_lib.go:
1該檔案中的函式hello()首字母大寫,表示可以被其他以外的包使用(public),否則只能在包內使用(private)。//demo5_lib.go
2package lib534
import (5"
fmt"6)
78 func hello(studentname string
)
要注意的是,該**包的包名特意設為lib5,那麼在demo5.go中引用hello函式時,就需要使用包名lib5,而不是匯入時指定的目錄名lib。
2. **包的匯入路徑必須與其所在目錄的相對路徑保持一致嗎?
**包匯入路徑可以和包名不一致,在使用的時候需要使用包名。
先使用lib的相對路徑,安裝前面提供的**包:
go install 36class/q5/lib
該命令執行成功後,會在當前過去(gopath)的pkg目錄下,生成相應的歸檔檔案,如:
pkg/windows_amd64/36class/q5/lib.a注意:原始碼檔案所在的目錄相對於gopath下src目錄的相對路徑,就是它**包匯入路徑,而實際使用時給定的限定符(如上述檔案中的「lib5.」)必須要與它宣告所屬的**包名稱一致。
要麼把 :
package lib5
改為:package lib
然後使用lib.hello,如果保持lib5不變,那麼就在呼叫限定符時使用「lib5.hello」。
3. 什麼樣的程式實體才可以被當前包外的**引用?
名稱的首字母為大寫的程式實體才可以被當前包外的**引用,否則它就只能被當前包內的其他**引用。
4. 對於程式實體,還可以使用怎樣的訪問許可權規則?
通過建立internal**包讓一些程式實體僅僅能被當前模組中的其他**引用。
這被稱為 go 程式實體的第三種訪問許可權:模組級私有。
具體規則是: internal**包中宣告的公開程式實體僅能被該**包的直接父包及其子包中的**引用。
當然,引用前需要先導入這個internal包。
對於其他**包,匯入該internal包都是非法的,無法通過編譯。
思考題:
q1: 如果需要匯入兩個**包,而這兩個**包的匯入路徑的最後一級是相同的,比如:dep/lib/flag和flag,那麼會產生衝突嗎?
a1: 會報錯redeclared。
q2: 如果會產生衝突,那麼怎樣解決這種衝突,有幾種方式?
可以通過包別名的方式解決衝突,如果匯入的包不顯式使用可以採用匿名的方式匯入包。
Golang基礎學習筆記03
day03 一 復合型別 指標 1.指標的基本操作 var a int 10 fmt.printf d n a 變數的記憶體 fmt.printf v n a 變數的位址 fmt.printf p n a 變數的位址 fmt.println a 變數的位址 儲存某個變數的位址,需要指標。int 儲存...
golang學習筆記 日誌庫 logrus
官方自己宣傳的最大亮點是 結構化。logrus的github位址 lfshook的github位址 file rotatelogs的github位址 pkg errors的github位址 這個日誌依賴庫,需要使用 func main info 描述資訊為golang日誌框架logrus的學習 設定...
Golang學習筆記
如果乙個method的receiver是 t,你可以在乙個t型別的例項變數v上面呼叫這個method,而不需要 v去呼叫這個method 即不需要 v method 如果乙個method的receiver是t,你可以在乙個 t型別的變數p上呼叫這個method,而不需要 p去呼叫這個method。i...