Перейти к ошибке генерации тега struct: «тег поля должен быть строкой» - PullRequest
0 голосов
/ 02 апреля 2019

Я впервые использую 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"'
}

1 Ответ

3 голосов
/ 02 апреля 2019

Вам нужно инкапсулировать ваши теги struct с обратными кавычками вместо использования одинарных кавычек для создания необработанных строковых литералов, которые могут позволить включение дополнительных данных в поле тега.

В этом посте дается хорошее объяснение тегов, их правильное построение, и они должны служить хорошим справочным материалом для дальнейшего объяснения, если это необходимо.

Рабочий код здесь:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...