【问题标题】:Go struct tag throwing error: "field tag must be a string"Go struct 标签抛出错误:“字段标签必须是字符串”
【发布时间】:2019-04-01 23:16:44
【问题描述】:

我是第一次使用 GO,并且正在设置一个小示例 API。在尝试从我创建的结构返回 JSON 对象时,当我将结构标记添加到我的字段时出现此错误:

“字段标签必须是字符串”和“无效字符文字(超过一个字符)”。

这是我的代码分解。我在这里错过了什么?

    package main

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

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/demo/v1/version", getVersion).Methods("GET")    
    log.Fatal(http.ListenAndServe(":8080", router))    
}


func getVersion(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    version := Version{ID: "demo", Version: "1.0.0", Sha: "some hash...."}
    var myJSON, err = json.Marshal(version)

    json.NewEncoder(w).Encode(myJSON)

}

type Version struct {
    //ERRORS on these 3 lines:
    ID      string 'json:"id"'
    Version string 'json:"version, omitempty"'
    Sha     string 'json:"sha"'
}

【问题讨论】:

  • 代码使用引号字符作为符文文字。使用其中一个引号字符代替字符串。

标签: go


【解决方案1】:

你需要用反引号封装你的结构标签,而不是使用单引号来创建可以允许在标签字段中包含额外数据的原始字符串文字。

This 帖子很好地解释了标签,它们是如何正确构建的,如果需要,应该作为进一步解释的良好参考。

这里的工作代码:

package main

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

    "github.com/gorilla/mux"
)

type Version struct {
    ID      string `json:"id"`
    Version string `json:"version, omitempty"`
    Sha     string `json:"sha"`
}

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/demo/v1/version", getVersion).Methods("GET")
    log.Fatal(http.ListenAndServe(":8080", router))
}

func getVersion(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    version := Version{ID: "demo", Version: "1.0.0", Sha: "some hash...."}
    var myJSON, err = json.Marshal(version)
    if err != nil {
        // handle error
    }
    json.NewEncoder(w).Encode(myJSON)
}

【讨论】:

  • 啊! facepalm 这是反引号,而不是单引号。即使经过这么多年,我仍然遇到“缺少分号”类型的错误......
  • linter 通常可以帮助我捕捉到这样的东西。 Here 是供您考虑的 go linter 列表
猜你喜欢
  • 2020-09-17
  • 1970-01-01
  • 2020-03-11
  • 2019-01-20
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多