我是Golang的新手,正在尝试制作一个简单的REST api应用程序。
最初,一切都很好,因为我将所有代码都放在main包下的同一目录中。
但是,现在我需要开始将代码重构为子目录和包。不幸的是,我还没能成功编译这个应用程序。
我的GOPATH设置为:~/.workspace当前应用程序位于:~/.workspace/src/gitlab.com/myapp/api-auth
这就是我当前的代码组织方式:

这是我的main.go
package main
import (
"net/http"
"os"
"strings"
"github.com/gorilla/context"
"github.com/justinas/alice"
"gopkg.in/mgo.v2"
"gitlab.com/myapp/api-auth/middlewares"
)
func main() {
privateKey := []byte(strings.Replace(os.Getenv("JWT_KEY"), "\\n", "\n", -1))
conn, err := mgo.Dial(os.Getenv("MONGO_CONN"))
if err != nil {
panic(err)
}
defer conn.Close()
conn.SetMode(mgo.Monotonic, true)
ctx := appContext{
conn.DB(os.Getenv("MONGO_DB")),
privateKey,
}
err = ctx.db.C("users").EnsureIndex(mgo.Index{
Key: []string{"username"},
Unique: true,
Background: true,
Sparse: false,
})
if err != nil {
panic(err)
}
commonHandlers := alice.New(LoggingHandler, context.ClearHandler, RecoveryHandler, AcceptHandler, ContentTypeHandler)
router := NewRouter()
router.Post("/users", commonHandlers.Append(BodyParserHandler(UserResource{})).ThenFunc(ctx.userCreationHandler))
router.Post("/sessions", commonHandlers.Append(BodyParserHandler(UserResource{})).ThenFunc(ctx.sessionCreationHandler))
http.ListenAndServe(":8080", router)
}
type appContext struct {
db *mgo.Database
privateKey []byte
}这是一个中间件accept.go (其余中间件的结构类似)
package middlewares
import "net/http"
// AcceptHandler ensures proper accept headers in requests
func AcceptHandler(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Accept") != "application/vnd.api+json" {
writeError(w, errNotAcceptable)
return
}
next.ServeHTTP(w, r)
}
return http.HandlerFunc(fn)
}这是我从应用程序的根目录运行go build时得到的错误。
# gitlab.com/utiliti.es/api-auth
./main.go:11: imported and not used: "gitlab.com/myapp/api-auth/middlewares"
./main.go:42: undefined: LoggingHandler
./main.go:42: undefined: RecoveryHandler
./main.go:42: undefined: AcceptHandler
./main.go:42: undefined: ContentTypeHandler
./main.go:45: undefined: BodyParserHandler
./main.go:46: undefined: BodyParserHandler发布于 2016-02-07 05:06:26
限定标识符是用包名前缀限定的标识符。包名和标识符都不能为空。
QualifiedIdent = PackageName“。标识符。
限定标识符访问必须导入的不同包中的标识符。标识符必须导出并在该包的包块中声明。
math.Sin //表示软件包数学中的Sin函数
导入声明声明包含声明的源文件取决于导入包的功能(§程序初始化和执行),并允许访问该包的导出标识符。导入命名一个用于访问的标识符(PackageName)和一个指定要导入的包的ImportPath。
ImportDecl = "import“( ImportSpec | "(”{ ImportSpec ";“} ")”)ImportSpec = ".“| PackageName ImportPath。ImportPath = string_lit。
在限定标识符中使用PackageName,以访问导入源文件中的包的导出标识符。它在file块中声明。如果省略PackageName,则默认为导入包的package子句中指定的标识符。如果显式句点(.)而不是名称,则在该包的包块中声明的所有包的导出标识符都将在导入源文件的文件块中声明,并且必须在没有限定符的情况下进行访问。
ImportPath的解释依赖于实现,但它通常是已编译包的完整文件名的子字符串,并且可能与已安装包的存储库相关。
实现限制:编译器可以仅使用属于Unicode的L、M、N、P和S常规类别的字符(不带空格的图形字符)将ImportPaths限制为非空字符串,也可以排除字符!"#$%&'()*、:;<=>?[]^`{|}和Unicode替换字符U+FFFD。
假设我们编译了一个包含package子句package math的包,该子句导出function Sin,并将编译后的包安装在由"lib/math“标识的文件中。此表说明了在各种类型的导入声明之后,如何在导入包的文件中访问Sin。
Import声明Sin的本地名称import "lib/math“math.Sin import m "lib/math”m.Sin导入。“库/数学”错误
导入声明声明了导入包和导入包之间的依赖关系。包直接或间接导入自身,或者直接导入包而不引用其任何导出的标识符都是非法的。要仅出于副作用(初始化)导入包,请使用空标识符作为显式包名称:
import _ "lib/math“
错误
./main.go:11: imported and not used: "gitlab.com/myapp/api-auth/middlewares"说明您在package main中没有使用package middlewares,这是真的。
错误
./main.go:42: undefined: AcceptHandler说明您没有在main包中定义AcceptHandler,这是真的。
限定标识符是用包名称前缀限定的标识符。限定标识符访问其他包中的标识符,该包必须导入。
例如,在包main中,使用限定标识符middlewares.AcceptHandler,这是导入"gitlab.com/myapp/api-auth/middlewares"的用法。
https://stackoverflow.com/questions/35243865
复制相似问题