为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号