golang 发起 http 请求的时候,设置 header 头的操作是线程安全的吗?

340 天前
 ben548
有如下代码:
req, _ := http.NewRequest("POST", "http://example.com", nil)
req.Header.Set("Content-Type", "application/json")
追了一下 golang 源码 header 是 map[string][]string 类型,
set 方法的源码是:
func (h Header) Set(key, value string) {
textproto.MIMEHeader(h).Set(key, value)
}
看上去,在做 header set 的时候,golang 并没有做加锁解锁等操作。
我还去看了下 resty 请求库和 gorequest 请求库,发现实现方式和 go 原生的是一样的。

我的需求:要并发发起 http post 请求,每个请求需要设置不同的 auth header 头
我的疑问:
1 、在设置 header 的时候是否存在 map 并发读写的问题?
2 、在并发发起 http post 请求的时候,request 是共用一个,还是每次发起都 new 一个?
1851 次点击
所在节点    Go 编程语言
8 条回复
hsfzxjy
340 天前
request 显然是每次都 new 一个
leonshaw
340 天前
1. 存在
2. 可以 new 一个模版然后 Clone
zlstone
340 天前
都是 new 一个新的
shawn4me
340 天前
同意一楼, 看你代码实现是 new 一个 request 后通过多个 goroutine 修改这个 request 来实现多个请求并发,还是每个请求都 new 一个 request , 后者每个 request 都是独立的所以并不会出现并发问题,前者的话不建议你这么做。
admpubcom
340 天前
在设计上就不是让你共享 request 的,那不是正确的使用方式。每次请求就是一个独立的 request 。
lasuar
340 天前
你这本身就是个骚操作,设计上不考虑这种情况,所以。
SingeeKing
340 天前
这不应该直接看下源码吗…

凭我的印象 http.Client Do 里面最初就直接 copy headers 了,也就是在这一步之间进行修改的话确实会 panic
wangritian
339 天前
你不会开多线程拼 header 吧[狗头]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943646

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX