golang中查询参数的解码

golang中查询参数的解码,go,struct,gorilla,Go,Struct,Gorilla,我有一个参数 id_user phone_number 我想解码到我的结构 type User struct{ IDUser int `json:"id_user"` PhoneNumber string `json:"phone_number"` } 可以解码成struct吗?我使用gorilla模式。我的代码: func User(w http.ResponseWriter, r *http.Request){ var decoder = schema.NewDe

我有一个参数

id_user
phone_number
我想解码到我的结构

type User struct{
     IDUser int `json:"id_user"`
     PhoneNumber string `json:"phone_number"`
}
可以解码成struct吗?我使用gorilla模式。我的代码:

func User(w http.ResponseWriter, r *http.Request){
  var decoder = schema.NewDecoder()
  var user User
  if err := r.ParseForm(); err != nil {
     fmt.Println(err)
  }

  err := decoder.Decode(&user, r.PostForm)
  if err != nil {
     fmt.Println(err)
  }
  respBody, err := json.Marshal(user)
  w.Header().Set("Content-Type", "application/json")
  w.WriteHeader(http.StatusOK)
  w.Write(respBody)
}

我输入id\u user=1和phone\u number=qwerty。但是结果是id\u user=0和phone\u number=。

我认为您应该从以下方面修复标签:

type User struct{
    IDUser         int     `json:id_user`
    PhoneNumber    string  `json:phone_number`
}
为此:

type User struct{
    IDUser         int     `json:"id_user"`
    PhoneNumber    string  `json:"phone_number"`
}

因此,您应该在标记名中使用引号。

如果您提到的两个字段是查询参数,您可以这样直接读取:

func User(w http.ResponseWriter, r *http.Request) {
idUser := r.URL.Query().Get("id_user")
phoneNumber := r.URL.Query().Get("phone_number")
var user User
id, err := strconv.Atoi(idUser)
if err != nil {
    fmt.Println("error converting string to int")
    return
}
user.IDUser = id
user.PhoneNumber = phoneNumber
respBody, _ := json.Marshal(user)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(respBody)
}
否则,您可以直接在api有效负载中传递用户结构,并像这样直接执行有效负载解码

    if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
      fmt.Println("error decoding api payload")
      return
    }

如果您想将它们直接解码到一个结构中,而不需要逐个获取字段的值,那么可以使用github.com/gorilla/schema。请参阅。

哈哈,谢谢。我可以编辑我的问题吗。我已经在我的代码中使用了标记名。如果这个答案是正确的并且对您有效-请将其标记为回答我已经使用了标记名,但这并不能解决我的问题。。在我的问题中,我忘了添加标记名。解码主体不是查询参数。把逻辑和语义弄清楚,剩下的就简单了。输出你在这里实际收到的东西,所有的东西都可能变得清晰。您可能只是接收到错误格式的参数,要么作为url参数,要么在正文中编码。