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发送请求正常,可能组包有问题,直接抓包对比吧。

golang 踩坑_sql

很明显设置的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中