2

来自 net/http 的源代码。的定义http.Headermap[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))
}
4

2 回答 2

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.

这可以在 Request 类型的 Header 字段的注释中找到。

http://golang.org/pkg/net/http/#Request

评论可能应该被移动了..

于 2012-09-25T15:55:34.700 回答
3

看一下参考http.Header和代码Get

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"}
于 2012-09-25T16:08:28.657 回答