Golang中如何计算*http.Request的request.Header的字节大小
Go 计算
http.Request Header 字节大小的实现 核心逻辑
http.Header 的类型定义为 type Header map[string][]string,每个键对应多个字符串值,需要分别对键、值切片内的所有字符串计算字节长度累加即可。
基础实现(仅计算键值内容字节)
func GetHeaderContentSize(req *http.Request) int { var bytesSize int for k, values := range req.Header { // 累加键的字节长度 bytesSize += len(k) // 遍历值切片累加每个值的字节长度 for _, v := range values { bytesSize += len(v) } } return bytesSize }
错误原因说明
之前的写法直接对 []string 类型的 values 取 len,得到的是切片的元素个数而非字符串内容的字节数,因此需要嵌套一层遍历取每个字符串的长度。
扩展实现(计算网络传输时的完整Header大小)
如果需要匹配HTTP协议实际传输时的字节数,需要包含分隔符、换行符占用的字节,实现如下:
func GetHeaderTransmissionSize(req *http.Request) int { var bytesSize int for k, values := range req.Header { for _, v := range values { // 计算单条Header行的大小:键 + ": " + 值 + "\r\n" bytesSize += len(k) + 2 + len(v) + 2 } } // Header末尾的空行分隔符"\r\n" bytesSize += 2 return bytesSize }
注意事项
Go语言中 len(string) 返回的是字符串UTF-8编码的字节数,和HTTP协议传输编码一致,无需额外转码处理。
内容的提问来源于stack exchange,提问作者Alex Kuzminov
相关产品推荐
相关产品推荐

