将变量限制为自身和其他特定包
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
包访问,但不能由 model
或 config
包。
一般来说,内部包(位于路径中有 internal
文件夹的文件夹内的包)只能从 internal
文件夹的父文件夹的根目录中导入。
查看相关问题:
我有这样的结构:
├── 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
包访问,但不能由 model
或 config
包。
一般来说,内部包(位于路径中有 internal
文件夹的文件夹内的包)只能从 internal
文件夹的父文件夹的根目录中导入。
查看相关问题: