我有這個結構:
├── app
│ ├── app.go
│ ├── handler
│ │ ├── common.go
│ │ └── users.go
│ ├── model
│ │ └── model.go
│ └── queries
│ └── queries.go
├── config
│ └── config.go
└── main.go
我所有的查詢(SQL 的)都在queries.go:
查詢.go:
package queries
const (
QueryFindUser = `SELECT * FROM users WHERE id=$1` // <------ HERE
)
users.go:
package handler
import (
"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 otherwise
func 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's 模塊,不包括model/model.go.
如果我宣告queryFindUser這將僅限于包queries,那么我將無法在任何地方使用它。
如何解決這個問題?無需使其可匯出到其他所有軟體包。我對 golang/java 很陌生,這個問題在 java 中也是一樣的。那么在這種情況下該怎么辦呢?如果你能提供對我也有幫助的資源。
uj5u.com熱心網友回復:
對識別符號的訪問權限不是那么精細,您可以指定您授予誰訪問權限。而且沒有必要。這將不必要地使使用(源代碼)和實作(編??譯時間、編譯的包物件和可執行二進制檔案大小)復雜化。
如果您只想授予對特定包的訪問權限,最簡單的方法是合并包并使識別符號不匯出。
如果您想授予對多個包的訪問權限,或者包會變得非常大,您可以使用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檔案夾父級為根的包中匯入。
查看相關問題:
我可以在多個源目錄中開發一個 go 包嗎?
不允許使用內部包
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/485169.html
