Go 的包結構

2021-09-27 11:22:20 字數 2361 閱讀 2275

除使用預設包名外,還可使用別名,已解決同名衝突問題。

歸納起來,有四種不同的匯入方式。

// 預設方式:test.a

// 別名方式:x.a

// 簡便方式:a

// 初始化方式:無法引用,僅用來初始化目標包

不能直接或間接匯入自己,不支援任何形式的迴圈匯入。

許可權

所有成員在包內均可訪問,無論是否在同一原始碼檔案中。但只有名稱首字母大寫的為可匯出成員,在包外可見。

改規則適用於全域性變數、全域性常量、型別、結構字段、函式、方法等。

可通過指標轉換等方式繞開該限制。

lib/data.go

package lib

type data struct

func

newdata()

*data

package main

import

("fmt"

"test/lib"

"unsafe"

)func

main()

)(unsafe.

pointer

(d))

p.x =

100 fmt.

printf

("%+v\n"

,*d)

}

初始化編譯器首先確保完成所有變數初始化,然後才開始執行初始化函式。直到這些全部結束後,執行時才正式進入 main.main 入口函式。

package main

var x =

100func

init()

func

main()

輸出:

init: 100

main: 101

可在初始化函式中建立 goroutine,或等它執行接收。

package main

import

("fmt"

"time"

)func

init()

)gofunc()

()}func

main()

輸出為:

init: 2019-09-27 08:50:12.657 +0800 cst m=+0.000360533

main: 2019-09-27 08:50:14.662415 +0800 cst m=+2.005772932

內部包

內部包機制相當於增加了新的訪問許可權控制:所有儲存在 internal 目錄下的包(包括自身)僅能被其父目錄下的包(包含所有層次的子目錄)訪問。

結構示例如下:

在go 中,引入 vendor 的機制,專門存放第三方包,實現將原始碼和依賴完整打包分發。

如果說 internal 針對內部,那麼 vendor 顯然就是 external。

匯入 vendor 中的第三方包,引數是以 vendor/ 為起點的決定路徑。這就避免了 vendor 目錄位置帶來的麻煩,讓匯入無論使用 vendor,還是gopath都能保持一致。

vendor 比標註庫優先順序更高。

顯然,上面的例子中有兩個名為 p 的包,在 main.go 和 test.go 分別匯入 p 時,它們各自對應誰?

其規則是:從當前原始檔所在目錄開始,逐級向上構造 vendor 全路徑,直到發現路徑匹配的目標為止。匹配失敗,則依舊搜尋 gopath. 對 main.go 而言,則構造的路徑是 src/server/vendor/p,也就是p1。而 test.go 最先構造出的路徑是 src/server/vendor/x/vendor/p,所以選擇 p2.

要使用 vendor 機制,須開啟「go15vendorexperiment=1」環境開關(go1.6預設開啟),且必須是設定了 gopath 的工作空間。

go語言中的閉包結構

每次呼叫 increment都會重新生成乙個閉包結構中的變數 內層函式 外層函式區域性變數 可以是入參或者定義的區域性變數 閉包結構 如果將乙個內層函式作為函式返回值 內層函式中又涉及到外層函式的區域性變數 自己定義或者外部傳進來的引數,都是區域性變數 1 2 條件滿足後,就會導致該區域性變數的宣告...

go包的理解

結論 import時指定的字串,是相對於 gopath的目錄路徑,告訴了go,要去載入這個目錄下所有的包檔案 不包括子目錄中的檔案 乙個目錄中所有的原始檔 不包括子目錄 代表了單獨的乙個包,這些原始檔內的package關鍵字指出的包名,必須一致,否則無法被使用 import指定的載入目錄 目錄中的原...

go 關於包的引入

沒有啟用 go111module 時,import 語句會在三個地方查詢包 相對目錄,比如 import mylib 會掃瞄並載入當前目錄下的mylib目錄下的所有go檔案,這時需要注意的是 import 相對路徑 這裡的路徑只是為了找到一堆go檔案,最後一級目錄名 可以 與 真正載入的 中的 包名...