代码如下:一个简单的http代码
```go
package main
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
)
// People ...
type People struct {
name string
age int
}
// IndexHandler ...
func IndexHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello go http server")
}
func (p People) toString() string {
return "name : " + p.name + ", age : " + strconv.Itoa(p.age)
}
// FormTest ...
func FormTest(w http.ResponseWriter, r *http.Request) {
//fmt.Fprintln(w, "FormTest")
r.ParseForm()
fmt.Println(r.Form)
fmt.Println("Path : ", r.URL.Path)
fmt.Println("Scheme : ", r.URL.Scheme)
fmt.Println("url_long : ", r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("k, v : ", k, v)
}
var p People
p.name = r.Form["name"][0]
p.age, _ = strconv.Atoi(r.Form["age"][0])
fmt.Println("p : ", p.toString())
data, err := json.Marshal(p)
fmt.Println(string(data))
if err != nil {
fmt.Println("error : ", err)
} else {
fmt.Fprintln(w, string(data))
}
}
func main() {
fmt.Println("server start ...")
http.HandleFunc("/", IndexHandler)
http.HandleFunc("/formtest", FormTest)
http.ListenAndServe("127.0.0.1:4199", nil)
}
```
我的表单数据通过formtest接口提交上来之后,数据是存在的,但是格式化为json数据的时候出错,只有一个`{}`,没有具体内容。
输出结果如下,请大佬们帮忙看下什么原因?
```
server start ...
map[age:[12] name:[xxxxxx]]
Path : /formtest
Scheme :
url_long : []
k, v : name [xxxxxx]
k, v : age [12]
p : name : xxxxxx, age : 12
{}
exit status 2
```
更多评论
原因在于,json.Marshal 在处理 struct 的时候,只会处理那些 "exported fields",也就是说,必须是首字母大写的 field name,对于你的例子,应该这么改:
```go
type People struct {
Name string
Age int
}
```
对于 struct 而言,field name 大写是个最佳实践,除非你确定不要被外部引用,否则都要大写。
#1
最好给struct加上tag,
type People struct {
Name string `json:"name"`
Age int `json:"age"`
}
#3