golang 踩坑

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中

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值