Golang學習筆記 03 庫原始碼檔案

2022-02-25 09:12:39 字數 2121 閱讀 3538

庫原始碼檔案:

不能被直接執行的原始碼檔案,它僅用於存放程式實體,這些程式實體可以被其他**使用。

**包宣告的基本規則:

1. 同目錄下的原始碼檔案的**包宣告語句要一致。也就是說,它們要同屬於乙個**包(package)。這對於所有原始碼檔案都是適用的。

如果目錄中有命令原始碼檔案,那麼其他種類的原始碼檔案也應該宣告屬於main包。這也是能夠成功構建執行它們的前提。

2. 原始碼檔案宣告的**包的名稱可以與其所在的目錄的名稱不同。在針對**包進行構建時,生成的結果檔案的主名稱與其父目錄的名稱一致。

對於命令原始碼檔案,構建生成可執行檔案的主名稱會與其父目錄的名稱相同。

面試題:

1. 如何拆分命令原始碼檔案到其他**包?

1

2package main34

import (5"

36class/q5/lib"6

"flag"7

)89var studentname string

1011

func init()

1415

func main()

在該命令原始碼檔案中,增加了匯入lib包,同時修改了main()函式。

再看下**包檔案:q5/lib/demo5_lib.go:

1

//demo5_lib.go

2package lib534

import (5"

fmt"6)

78 func hello(studentname string

)

該檔案中的函式hello()首字母大寫,表示可以被其他以外的包使用(public),否則只能在包內使用(private)。

要注意的是,該**包的包名特意設為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...