2015-03-31 51 views
-2

引用結構字段我有以下文件夾結構:從另一個包

. 
├── Makefile 
├── README.md 
├── myproject 
│   ├── handlers 
│   │   └── authorize_handler.go 
│   ├── models 
│   │   ├── id_token.go 
│   ├── server.go 

authorize_handler.go我嘗試從id_token.go文件中引用IdToken.idType領域。

authorize_handler.go

package handlers 

import (
    "encoding/json" 
    "log" 
    "net/http" 

    "myproject/models" 
) 

func AuthorizeHandler(rw http.ResponseWriter, req *http.Request) { 
    idToken := new(models.IdToken) 

    decoder := json.NewDecoder(req.Body) 
    err := decoder.Decode(&idToken) 
    if err != nil { 
     panic(err) 
    } 

    log.Println(idToken.idType) 
} 

id_token.go

package models 

type IdToken struct { 
    id  string `json:"id" type:"string" required:"true" max_length:"50"` 
    idType string `json:"idType" type:"idType" required:"false"` 
} 

當我server.go使用go run server.go我收到以下錯誤啓動:

handlers/authorize_handler.go:29: idToken.idType undefined (cannot refer to unexported field or method idType) 

IdToken移至authorize_handler.go確實可以解決問題。將idType更改爲IdType不會。

任何想法或指針分享?

+1

將字段名稱更改爲「IdType」時會得到什麼結果?出口是以資本化爲基礎的。如果你想從另一個包中引用它,它需要是大寫。 – captncraig 2015-03-31 18:19:59

+0

@captncraig我不知道這裏發生了什麼,但是現在當我大寫'Id'和'IdType'時,它就可以工作了。 – 2015-03-31 19:59:13

回答

-1

如果包位於您的$GOPATH/src目錄中,那麼當您告訴它無需文件路徑導入時,它就是它查找它的地方。

或者,您可以使用相對路徑(如../models)進行引用,但可能會變得混亂。此外,這種文件結構往往會導致週期性的依賴關係,因此請注意確保您避免使用此方法。

編輯:正如captncraig指出的那樣,編譯器似乎找到了包,因此更可能是因爲結構中的字段以定義中的小寫字符開頭而未導出。只要將它改爲大寫字母,就可以從包裹外公開訪問。

type IdToken struct { 
    Id  string `json:"id" type:"string" required:"true" max_length:"50"` 
    IdType string `json:"idType" type:"idType" required:"false"` 
} 
+2

由他的編譯器輸出,它似乎不是一個包解析問題,因爲它意識到該字段存在但不會導出。但是,一如既往,我建議任何人閱讀https://golang.org/doc/code.html – captncraig 2015-03-31 18:23:52

+0

我明白你在說什麼。好點子。你是對的,它可能是未出口的領域,而不是他無法找到的包裝本身。 – Verran 2015-03-31 18:24:48