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

2023-05-28 18:19:48 +08:00
 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 一个?
1987 次点击
所在节点    Go 编程语言
8 条回复
hsfzxjy
2023-05-28 18:22:07 +08:00
request 显然是每次都 new 一个
leonshaw
2023-05-28 18:25:25 +08:00
1. 存在
2. 可以 new 一个模版然后 Clone
zlstone
2023-05-28 20:41:41 +08:00
都是 new 一个新的
shawn4me
2023-05-28 20:41:53 +08:00
同意一楼, 看你代码实现是 new 一个 request 后通过多个 goroutine 修改这个 request 来实现多个请求并发,还是每个请求都 new 一个 request , 后者每个 request 都是独立的所以并不会出现并发问题,前者的话不建议你这么做。
admpubcom
2023-05-28 20:53:16 +08:00
在设计上就不是让你共享 request 的,那不是正确的使用方式。每次请求就是一个独立的 request 。
lasuar
2023-05-28 20:58:14 +08:00
你这本身就是个骚操作,设计上不考虑这种情况,所以。
SingeeKing
2023-05-29 01:45:05 +08:00
这不应该直接看下源码吗…

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

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

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

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

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

© 2021 V2EX