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

Restrict variable to itself and to other certain package

我有这样的结构:

├── app
│   ├── app.go
│   ├── handler
│   │   ├── common.go
│   │   └── users.go
│   ├── model
│   │   └── model.go
│   └── queries
│       └── queries.go
├── config
│   └── config.go
└── main.go

我所有的查询(SQL 个)都在 queries.go:

queries.go:

package queries

const (
    QueryFindUser = `SELECT * FROM users WHERE id=` // <------ 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(首字母大写),那么它将可以导出到所有其他包。但我不希望通过说 config/config.go

访问它

我希望它仅限于 handler 的模块,仅排除 model/model.go

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

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

标识符的访问权限不够精细,您无法指定要授予访问权限的人员。而且没有必要。这会使使用(源代码)和实现(编​​译时间、编译包对象和可执行二进制文件大小)变得不必要地复杂化。

如果您只想授予对特定包的访问权限,最简单的方法是合并这些包并使标识符不被导出。

如果您想授予对多个包的访问权限,否则包会变得非常大,您可以使用 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 包访问,但不能由 modelconfig 包。

一般来说,内部包(位于路径中有 internal 文件夹的文件夹内的包)只能从 internal 文件夹的父文件夹的根目录中导入。

查看相关问题: