在 Go 中返回一个值而不是一个指针
Returning a value instead of a pointer in Go
在Go的"net/http"包中,有一个接口叫做ResponseWriter
。该接口有一个名为 Header() Header
的方法。由于 Header()
returns 的 Header
值是一个值而不是指针,我假设该函数不会 returning 实际的 Header
值对 ResponseWriter
是私有的,而是一个副本。
然而,情况似乎并非如此。 ResponseWriter
的文档显示 r.Header().Add("key", "value")
是将 header 添加到您的 http 响应的正确方法。
我深入挖掘并找到了 Header
类型的定义。是type Header map[string][]string
。我在这里有点困惑。在这种情况下,您不必 return 一个指针来修改 ResponseWriter
的值吗?如果是,为什么?
那是因为映射和切片是引用类型。
看看这段代码:
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"}
在Go的"net/http"包中,有一个接口叫做ResponseWriter
。该接口有一个名为 Header() Header
的方法。由于 Header()
returns 的 Header
值是一个值而不是指针,我假设该函数不会 returning 实际的 Header
值对 ResponseWriter
是私有的,而是一个副本。
然而,情况似乎并非如此。 ResponseWriter
的文档显示 r.Header().Add("key", "value")
是将 header 添加到您的 http 响应的正确方法。
我深入挖掘并找到了 Header
类型的定义。是type Header map[string][]string
。我在这里有点困惑。在这种情况下,您不必 return 一个指针来修改 ResponseWriter
的值吗?如果是,为什么?
那是因为映射和切片是引用类型。 看看这段代码:
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"}