将变量限制为自身和其他特定包

我有这样的结构:


├── 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

)

用户去:


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仅排除model/model.go.


如果我声明queryFindUser这将仅限于包queries,那么我将无法在任何地方使用它。


这个东西怎么解决?无需将其导出到所有其他包。我对 golang/java 很陌生,这个问题在 java 中也一样。那么在这种情况下该怎么办?如果你能提供对我也有帮助的资源。


青春有我
浏览 107回答 1
1回答

慕运维8079593

对标识符的访问权限不是细粒度的,您可以指定您授予访问权限的人。而且没有必要。这会使使用(源代码)和实现(编译时间、编译包对象和可执行二进制文件大小)变得不必要地复杂化。如果您只想授予对特定包的访问权限,最简单的方法是合并包并使标识符不被导出。如果你想授予对多个包的访问权限或者包会变得非常大,你可以使用internal packages。引入了内部包,因此您可以将“大”包分解为多个较小的包,并且仍然隐藏实现细节并保护其免受“外部”(来自其他包)的影响。内部包可以定义导出标识符,但只允许“内部组”访问它们。例如:├── app│&nbsp; &nbsp;├── app.go│&nbsp; &nbsp;├── handler│&nbsp; &nbsp;│&nbsp; &nbsp;├── internal│&nbsp; &nbsp;│&nbsp; &nbsp;│&nbsp; &nbsp;├── queries│&nbsp; &nbsp;│&nbsp; &nbsp;│&nbsp; &nbsp;│&nbsp; &nbsp;└── queries.go│&nbsp; &nbsp;│&nbsp; &nbsp;│&nbsp; &nbsp;└── foo│&nbsp; &nbsp;│&nbsp; &nbsp;│&nbsp; &nbsp; &nbsp; &nbsp;└── foo.go│&nbsp; &nbsp;│&nbsp; &nbsp;├── users.go│&nbsp; &nbsp;│&nbsp; &nbsp;├── common.go│&nbsp; &nbsp;│&nbsp; &nbsp;└── users.go│&nbsp; &nbsp;└── model│&nbsp; &nbsp; &nbsp; &nbsp;└── model.go├── config│&nbsp; &nbsp;└── config.go└── main.go在此示例中,queries包可由handler包和foo包访问,但不可由包model或config包访问。通常,内部包(internal位于其路径中有文件夹的文件夹内的包)只能从以该文件夹的父internal文件夹为根的包中导入。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go