2016-04-16 16 views
1

Goのnet/httpパッケージには、ResponseWriterというインターフェイスがあります。このインタフェースはHeader() Headerというメソッドを持っています。 Header()が返す値はHeaderなので、ポインタではない値であるので、実際のHeaderの値はResponseWriterのプライベートな値ではなくコピーであると仮定しています。Goのポインタの代わりに値を返す

ただし、これは当てはまりません。 ResponseWriterのドキュメントでは、http応答にヘッダーを追加する適切な方法としてr.Header().Add("key", "value")が表示されます。

少し深く掘り下げて、Headerタイプの定義を見つけました。それはtype Header map[string][]stringです。私はここで少し混乱している。この場合、ResponseWriterの値を変更するためにポインタを返す必要はありませんか?もしそうなら、なぜですか?

答えて

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

これは、同じ結果になります。

+0

お返事ありがとうございます。正しいと思われる。私はもう少し詳しく説明しました。 https://groups.google.com/forum/#!topic/golang-nuts/xQUsmdo6oSs –

関連する問題