Go 保留字
internal
Go 的 internal 是一個保留目錄名稱,用於限制套件(package)的可見性與匯入範圍。
規則說明
當專案目錄結構中出現 internal 資料夾時:
- 允許匯入:
internal底下的套件只能被與該internal同層或上層的程式碼匯入 - 禁止匯入:其他 repository、其他 Go module 無法匯入
internal內的套件
my-project/
├── go.mod
├── main.go
├── internal/
│ ├── util/
│ │ └── util.go
│ └── config/
│ └── config.go
└── pkg/
└── public/
└── public.go
main.go、pkg/public/public.go可以import "my-project/internal/util"- 另一個 repo(例如
other-repo)的程式碼無法import "my-project/internal/util",編譯會失敗
典型錯誤訊息
若外部專案嘗試匯入 internal 套件,會出現類似:
use of internal package xxx/internal/yyy not allowed
使用時機
- 將僅供本專案使用的邏輯放在
internal,避免對外暴露實作細節 - 將對外提供的公開 API 放在
pkg/或專案根目錄的套件
與 pkg 的差異
| 目錄 | 可見範圍 |
|---|---|
internal/ | 僅限同一 module 內部 |
pkg/ | 可被其他 module 匯入(若路徑正確) |
透過 internal,可以明確區分「私有實作」與「公開 API」。