golang 语言简洁,强大,但使用过程中存在一些有标新立异之处,很容易踩坑。
1. Host 未生效
使用http 发送post请求,服务端一直返回参数错误。
reader := bytes.NewReader([]byte(postData))
req, _ := http.NewRequest("POST", url, reader)
// 设置头部信息
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Host", host)
但是用curl发送请求正常,可能组包有问题,直接抓包对比吧。
很明显设置的host未生效,看来set host代码不起作用,搜索发现req提供了Host 参数来设置host信息。Golang API 规范不一致,很容易踩坑,解决方案:
req.Host = host
2. Json 科学计数法
govalidator 校验结构字段出错:
2020/03/21 10:26:25 apphandler.go:125: [ERROR] false, function only accepts structs; got float64
一直提示json 有浮点类型字段,可是源请求中没有携带float数值。原因是json.Marshal会将数值转化为float64类型,数值>=1000000 时自动采用科学计数法(1e6)。
解决方案:
// 一行代码变三行
d := json.NewDecoder(bytes.NewReader(content))
d.UseNumber()
err = d.Decode(param)
// 解析为json.Number类型
value := param["prop"].(json.Number).Int64()
3. gorm框架
gorm 比较常用ORM库,强大的反射机制按操作db如丝般顺滑,使用过程中api描述不是很详细,容易出错。
3.1 Find函数
// 查询多条记录
err := db.Find(&sm).Error
// 判断记录是否空
if gorm.IsRecordNotFoundError(err) {
}
Find() 查询多条记录,当记录为空时,此时err为空,判断条件未触发。可通过len(sm) 判断结果
3.2 Exec() 函数
err := db.Exec(sql).Where("status=?", 0).Error
Exec执行自定义sql,此时where条件是会被忽略的,可将where过滤条件放到sql中