来自net / http的源代码。 http.Header
的定义是map[string][]string
。正确?
但为什么go run
低于代码,我得到了结果:
0
2
func main() {
var header = make(http.Header)
header.Add("hello", "world")
header.Add("hello", "anotherworld")
var t = []string {"a", "b"}
fmt.Printf("%d\n", len(header["hello"]))
fmt.Print(len(t))
}
答案 0 :(得分:3)
如果你尝试
fmt.Println(header)
您会注意到该密钥已被大写。这实际上在net / http。
的文档中有说明// HTTP defines that header names are case-insensitive.
// The request parser implements this by canonicalizing the
// name, making the first character and any characters
// following a hyphen uppercase and the rest lowercase.
这可以在类型请求的字段标题的注释中找到。
http://golang.org/pkg/net/http/#Request
虽然应该移动评论..
答案 1 :(得分:3)
查看http.Header
的引用和Get
的代码:
获取与给定键关联的第一个值。如果没有与该键相关联的值,则Get返回“”。要访问密钥的多个值,请使用CanonicalHeaderKey直接访问地图。
因此,使用http.CanonicalHeaderKey
而不是键的字符串会有所帮助。
package main
import (
"net/http"
"fmt"
)
func main() {
header := make(http.Header)
var key = http.CanonicalHeaderKey("hello")
header.Add(key, "world")
header.Add(key, "anotherworld")
fmt.Printf("%#v\n", header)
fmt.Printf("%#v\n", header.Get(key))
fmt.Printf("%#v\n", header[key])
}
输出:
http.Header{"Hello":[]string{"world", "anotherworld"}}
"world"
[]string{"world", "anotherworld"}