亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將變量限制為自身和其他特定包

將變量限制為自身和其他特定包

Go
青春有我 2022-12-19 17:50:36
我有這樣的結構:├── app│   ├── app.go│   ├── handler│   │   ├── common.go│   │   └── users.go│   ├── model│   │   └── model.go│   └── queries│       └── queries.go├── config│   └── config.go└── main.go我所有的查詢(SQL 查詢)都在queries.go:查詢.go:package queriesconst (    QueryFindUser = `SELECT * FROM users WHERE id=$1` // <------ HERE)用戶去:package handlerimport (    "GO_APP/app/model"    "GO_APP/app/queries"    "fmt"    "net/http"    "strconv"    "github.com/julienschmidt/httprouter"    _ "github.com/jinzhu/gorm/dialects/postgres"    "github.com/jmoiron/sqlx")var db *sqlx.DB// getUserOr404 gets a User instance if exists, or respond the 404 error otherwisefunc getUserOr404(db *sqlx.DB, id int, w http.ResponseWriter, r *http.Request) (*model.User, error) {    user := model.User{}    err := db.Get(&user, queries.QueryFindUser, id) // <----- Here    return &user, err}如果我使用QueryFindUser(首字母大寫),那么它將可以導出到所有其他包。但我不希望通過 say 訪問它config/config.go我希望它僅限于handler僅排除model/model.go.如果我聲明queryFindUser這將僅限于包queries,那么我將無法在任何地方使用它。這個東西怎么解決?無需將其導出到所有其他包。我對 golang/java 很陌生,這個問題在 java 中也一樣。那么在這種情況下該怎么辦?如果你能提供對我也有幫助的資源。
查看完整描述

1 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

對標識符的訪問權限不是細粒度的,您可以指定您授予訪問權限的人。而且沒有必要。這會使使用(源代碼)和實現(編譯時間、編譯包對象和可執行二進制文件大小)變得不必要地復雜化。


如果您只想授予對特定包的訪問權限,最簡單的方法是合并包并使標識符不被導出。


如果你想授予對多個包的訪問權限或者包會變得非常大,你可以使用internal packages。引入了內部包,因此您可以將“大”包分解為多個較小的包,并且仍然隱藏實現細節并保護其免受“外部”(來自其他包)的影響。


內部包可以定義導出標識符,但只允許“內部組”訪問它們。


例如:


├── app

│   ├── app.go

│   ├── handler

│   │   ├── internal

│   │   │   ├── queries

│   │   │   │   └── queries.go

│   │   │   └── foo

│   │   │       └── foo.go

│   │   ├── users.go

│   │   ├── common.go

│   │   └── users.go

│   └── model

│       └── model.go

├── config

│   └── config.go

└── main.go

在此示例中,queries包可由handler包和foo包訪問,但不可由包model或config包訪問。


通常,內部包(internal位于其路徑中有文件夾的文件夾內的包)只能從以該文件夾的父internal文件夾為根的包中導入。


查看完整回答
反對 回復 2022-12-19
  • 1 回答
  • 0 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號