引用另一个包中的struct字段

时间:2015-03-31 18:15:58

标签: go

我有以下文件夹结构:

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

authorize_handler.go我尝试引用IdToken.idType文件中的id_token.go字段。

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 个答案:

答案 0 :(得分:-1)

当前导入它的唯一方法就是myproject/models目录中的$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"`
}