Golang模塊級(jí)私有包(Internal Package Mechanism)詳解
引言
熟悉Golang的同學(xué)應(yīng)該都知道Golang的包機(jī)制,一個(gè)包中的程序?qū)嶓w有兩種訪問(wèn)權(quán)限:可導(dǎo)出(其他包可以訪問(wèn))和不可導(dǎo)出(其他包不能訪問(wèn),包內(nèi)可訪問(wèn))。
但是這兩種訪問(wèn)權(quán)限并不能滿足所有的場(chǎng)景,例如組織WEB項(xiàng)目目錄結(jié)構(gòu)的場(chǎng)景。組織WEB項(xiàng)目目錄結(jié)構(gòu)的典型場(chǎng)景如下:一般把項(xiàng)目中處理業(yè)務(wù)邏輯的部分放在一起(分為三層,分別是接口表示層(api)、業(yè)務(wù)邏輯層(bll),數(shù)據(jù)訪問(wèn)層(dal)),不希望其他部分代碼訪問(wèn)業(yè)務(wù)邏輯部分的代碼,而允許業(yè)務(wù)邏輯部分代碼訪問(wèn)其他部分代碼,這樣嚴(yán)格分為業(yè)務(wù)邏輯部分和非業(yè)務(wù)邏輯部分,結(jié)構(gòu)清晰,方便維護(hù)。要從根本上防止其他部分代碼不能訪問(wèn)業(yè)務(wù)邏輯部分的代碼一般語(yǔ)言都沒(méi)有提供這種機(jī)制,Golang從1.4引入的內(nèi)部包機(jī)制(將包命名為internal)就可以實(shí)現(xiàn)這一點(diǎn)。
什么是內(nèi)部包(Internal packages)?
內(nèi)部包就是將代碼放在名為internal的目錄或名為internal的目錄的子目錄中。有以下特點(diǎn):
- /a/b/c/internal/d/e/f目錄中的代碼只能被/a/b/c目錄中代碼(文件或子目錄中代碼)導(dǎo)入,而不能被/a/b/g目錄下的代碼導(dǎo)入;
- $GOROOT/src/pkg/internal/xxx只能被$GOROOT/src/目錄中代碼導(dǎo)入(文件或子目錄中代碼);
- $GOROOT/src/pkg/net/http/internal只能被net/http和net/http/* 導(dǎo)入;
- $GOPATH/src/mypkg/internal/foo只能被$GOPATH/src/mypkg目錄中的代碼導(dǎo)入(文件或子目錄中代碼)。
示例說(shuō)明
以如下目錄結(jié)構(gòu)為例說(shuō)明:
├── pkg1
│ ├── internal
│ │ ├── sub2
│ │ └── sub2.go
│ │ └── test1.go
│ │
│ ├── sub1
│ │ └── test2.go
│ └── pkg1.go
├── pkg2
│ └── pkg2.go
└── main.go
可以導(dǎo)入internal包的代碼:test2.go、pkg1.go和sub2.go,不能導(dǎo)入internal包的代碼:main.go和pkg2.go。
可以導(dǎo)入sub2包的代碼:test2.go、pkg1.go和test1.go,不能導(dǎo)入sub2包的代碼:main.go和pkg2.go。
小結(jié)
本文介紹了internal包的作用和使用場(chǎng)景,一定要親手寫代碼體會(huì)一下其使用方法和使用場(chǎng)景。