前段时间修改了一个小小的管理系统,本来是挺简单的 按照用户需求显示一些数据,但是却为了一个小小的错误,竟然找了两个晚上的bug,白天上课,所以只能晚上做东西了,好了,进入正题。


一般我们在js中发送一个json对象时,会使用JSON.stringify() 将一个json对象转换为json字符串,再发送.e.g

var obj = {
            "item1":"item1",
            "item2":"item2",
            "item3":"item3"
        };
        console.log(obj);
        console.log(JSON.stringify(obj));
        $.ajax({
            url: "/test",
            type: "POST",
            data: {
                "data":JSON.stringify(obj)
            },
            dataType:"json",
            success:function(data){
                //dosomething
            },
            error:function(arg_msg){
                //dosomething
            }
        });

这里写图片描述
可以看到第一次打印obj是一个json对象,而第二次打印是一个stirng,而我们就是要发送这一个json字符串。

首先贴上golang的代码:

type Obj struct {
    item1   string `item1`
    item2   string `item2`
    item3   string `item3`
}
func TestHandle(w http.ResponseWriter, r *http.Request){
    fmt.Println("test start...")
    obj := Obj{}
    r.ParseForm()
    temp := r.FormValue("data") //receive value form js
    fmt.Println(temp)           //type string
    err := json.Unmarshal([]byte(temp),&obj)
    if(err != nil ){
        fmt.Println("json error")
    }
    fmt.Println(obj.item1)      //如果显示成功,说明golang转换json成功
}

然后我们看看golang得到了什么
这里写图片描述
得到这个字符串了,但是却不能使用obj.item1,为什么呢,golang 结构体当中大写开头的是可导出字符,小写开头的是不可导出字符。就类似于c++中class的public, private,小写只能内部访问,大写就相当于public了。

type Obj struct {
    Item1   string `item1`
    Item2   string `item2`
    Item3   string `item3`
}

这里写图片描述

obj.Item1就得到了,是不是很简单啊,嘻嘻,感觉这和写c++时找了好几小时的错误,结果就是变量名写错了,少写个分号或者函数声明的参数和函数定义的参数不同的错误一样,就是这么坑。