Jquery中文网 www.jquerycn.cn
Jquery中文网 >  后端编程  >  Go语言  >  正文 golang 踩坑

golang 踩坑

发布时间:2021-04-30   编辑:www.jquerycn.cn
jquery中文网为您提供golang 踩坑等资源,欢迎您收藏本站,我们将为您提供最新的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中

 


 

到此这篇关于“golang 踩坑”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang 踩坑
golang服务发送http请求 400错误 排错备忘
php 踩坑 PDO foreach bindParam
go、golang结构体对象转Json失败原因总结
Golang中defer关键字实现原理
踩了 Golang sync.Map 的一个坑
go golang 笔试题 面试题 笔试 面试
php架构师都要会什么
详解HTML5 录音遇到的坑
golang 反射_golang 内存管理分析

[关闭]