2016-04-16 15 views
1

Im Paket "net/http" von Go gibt es eine Schnittstelle mit der Bezeichnung ResponseWriter. Diese Schnittstelle hat eine Methode namens Header() Header. Da der Header Wert, den Header() zurückgibt, ein Wert und kein Zeiger ist, nahm ich an, dass die Funktion nicht den tatsächlichen Header Wert zurückgeben würde, der zum ResponseWriter privaten ist, aber eher eine Kopie.Zurückgeben eines Werts anstelle eines Zeigers in Go

Dies scheint jedoch nicht der Fall zu sein. Die Dokumente für ResponseWriter zeigen r.Header().Add("key", "value") als die richtige Methode zum Hinzufügen einer Kopfzeile zu Ihrer HTTP-Antwort.

Ich grub ein wenig tiefer und fand die Definition für die Header Art. Es ist type Header map[string][]string. Ich bin hier ein wenig verwirrt. Müssen Sie in diesem Fall keinen Zeiger zurückgeben, um den Wert zu ändern, den ResponseWriter hat? Wenn ja warum?

Antwort

4

Das liegt daran, dass Karten und Slices Referenztypen sind. Schauen Sie diesen Code:

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) 
} 

Die Ausgabe lautet:

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

See/edit in the Go Playground.

Dies hat das gleiche Ergebnis:

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) 
} 

Ausgang:

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

See/edit in the Go Playground.

+0

Danke für die schnelle Antwort. Scheint korrekt. Ich fand das, was die Sache etwas ausführlicher erklärte. https://groups.google.com/forum/#!topic/golang-nuts/xQUsmdo6oSs –

Verwandte Themen