亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 Golang 的子目錄正確導入包?

如何從 Golang 的子目錄正確導入包?

Go
慕碼人8056858 2021-12-07 18:54:52
我對 Golang 還很陌生,正在嘗試制作一個簡單的 REST api 應用程序。最初,一切都很好,因為我將所有代碼都放在main包下的同一目錄中。但是,現在我處于需要開始將代碼重構為子目錄和包的階段。不幸的是,我未能成功編譯該應用程序。我GOPATH的設置為:~/.workspace 當前應用程序位于:~/.workspace/src/gitlab.com/myapp/api-auth這是我目前的代碼組織方式:這是我的 main.gopackage mainimport (    "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 middlewaresimport "net/http"// AcceptHandler ensures proper accept headers in requestsfunc 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)}
查看完整描述

1 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

限定標識符是用包名稱前綴限定的標識符。包名和標識符都不能為空。


QualifiedIdent = PackageName "." identifier .

限定標識符訪問必須導入的不同包中的標識符。標識符必須在該包的包塊中導出和聲明。


math.Sin  // denotes the Sin function in package math

進口申報


導入聲明聲明包含聲明的源文件取決于導入包的功能(§程序初始化和執行),并允許訪問該包的導出標識符。導入命名用于訪問的標識符 (PackageName) 和指定要導入的包的 ImportPath。


    ImportDecl       = "import" ( ImportSpec | "(" { ImportSpec ";" } ")" ) .

    ImportSpec       = [ "." | PackageName ] ImportPath .

    ImportPath       = string_lit .

PackageName 用于限定標識符以訪問導入源文件中包的導出標識符。它在文件塊中聲明。如果省略 PackageName,則默認為導入包的包子句中指定的標識符。如果出現顯式句點 (.) 而不是名稱,則在該包的包塊中聲明的所有包的導出標識符將在導入源文件的文件塊中聲明,并且必須在沒有限定符的情況下訪問。


ImportPath 的解釋依賴于實現,但它通常是已編譯包的完整文件名的子字符串,并且可能與已安裝包的存儲庫相關。


實現限制:編譯器可以將 ImportPaths 限制為僅使用屬于 Unicode 的 L、M、N、P 和 S 通用類別(沒有空格的圖形字符)的字符的非空字符串,也可以排除字符 !"#$%& '()*,:;<=>?[]^`{|} 和 Unicode 替換字符 U+FFFD。


假設我們編譯了一個包含 package 子句 package math 的包,它導出函數 Sin,并將編譯后的包安裝在“lib/math”標識的文件中。此表說明了在各種類型的導入聲明之后如何在導入包的文件中訪問 Sin。


    Import declaration          Local name of Sin


    import   "lib/math"         math.Sin

    import m "lib/math"         m.Sin

    import . "lib/math"         Sin

導入聲明聲明了導入包和導入包之間的依賴關系。一個包直接或間接地導入自己,或者直接導入一個包而不引用它的任何導出標識符都是非法的。要僅為其副作用(初始化)導入包,請使用空白標識符作為顯式包名稱:


    import _ "lib/math"

錯誤


./main.go:11: imported and not used: "gitlab.com/myapp/api-auth/middlewares"

說你沒有使用 package middlewaresin package main,這是真的。


錯誤


./main.go:42: undefined: AcceptHandler

說你沒有AcceptHandler在 package 中定義main,這是真的。


“限定標識符是用包名稱前綴限定的標識符。限定標識符訪問必須導入的不同包中的標識符?!?/p>


例如,在 package 中main,使用限定標識符middlewares.AcceptHandler,這是 import 的一種用法"gitlab.com/myapp/api-auth/middlewares"。


查看完整回答
反對 回復 2021-12-07
  • 1 回答
  • 0 關注
  • 382 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號