在Go中返回值而不是指针

时间:2016-04-16 04:53:27

标签: http go maps

在" net / http" Go包,有一个名为ResponseWriter的界面。此接口有一个名为Header() Header的方法。由于Header返回的Header()值是一个值而不是一个指针,我假设该函数不会返回Header私有的实际ResponseWriter值,但是而是一份副本。

但是,情况似乎并非如此。 ResponseWriter的文档显示r.Header().Add("key", "value")是向http响应添加标头的正确方法。

我深入挖掘并找到了Header类型的定义。它是type Header map[string][]string。我在这里有点困惑。在这种情况下,您是否必须返回指针才能修改ResponseWriter具有的值?如果是这样的话?

1 个答案:

答案 0 :(得分:4)

那是因为地图和切片是参考类型。 看看这段代码:

package main

import (
    "fmt"
)

func main() {
    m1 := make(map[string]string)
    var m2 map[string]string
    m1["one"] = "this is from m1"
    m2 = m1
    m2["two"] = "this is from m2"
    fmt.Printf("%#v\n", m1)
}

输出结果为:

map[string]string{"one":"this is from m1", "two":"this is from m2"}

See/edit in the Go Playground

这有相同的结果:

package main

import (
    "fmt"
)

type mymap map[string]string

func main() {
    m1 := make(mymap)
    var m2 mymap
    m1["one"] = "this is from m1"
    m2 = m1
    m2["two"] = "this is from m2"
    fmt.Printf("%#v\n", m1)
}

输出:

main.mymap{"one":"this is from m1", "two":"this is from m2"}

See/edit in the Go Playground