2012-09-21 20 views
22

ich folgendes struct haben die net/http.Request a enthält:initialisieren eingebettet Struktur in Go

type MyRequest struct { 
    http.Request 
    PathParams map[string]string 
} 

Jetzt möchte ich die anonyme innere Struktur http.Request in der folgenden Funktion initialisieren:

func New(origRequest *http.Request, pathParams map[string]string) *MyRequest { 
    req := new(MyRequest) 
    req.PathParams = pathParams 
    return req 
} 

Wie kann ich initialisiere die innere Struktur mit dem Parameter origRequest?

Antwort

10

Was:

func New(origRequest *http.Request, pathParams map[string]string) *MyRequest { 
     return &MyRequest{*origRequest, pathParams} 
} 

Es zeigt, dass statt

New(foo, bar) 

Sie können nur

&MyRequest{*foo, bar} 

direkt bevorzugen.

+1

Wie wäre es, wenn ein Feld nicht initialisiert werden soll, z. B. eine Datei vom Typ sync.Mutex? –

+0

Der Nullwert eines Mutex sollte ein ready-to-use-Mutex sein, so dass Sie einfach gut es als eingebettetes Wert einschließlich: 'var trifft struct { sync.Mutex n int} hits. Lock() hits.n ++ hits.Unlock() ' (aus [10 Dinge, die Sie wahrscheinlich nicht über Go wissen] (https://talks.golang.org/2012/10things.slide#3)) – Alaska

24
req := new(MyRequest) 
req.PathParams = pathParams 
req.Request = origRequest 

oder ...

req := &MyRequest{ 
    PathParams: pathParams 
    Request: origRequest 
} 

See: http://golang.org/ref/spec#Struct_types für mehr über das Einbetten und wie die Felder genannt bekommen.

+0

Ich bekomme den Compiler Fehler 'kann nicht verwenden origRequest (Typ * http.Request) als Typ http.Request in Zuweisung'. Ich vermute, das liegt daran, dass "Anfrage" kein benanntes Feld ist. – deamon

+3

Nein, weil der Typ des Feldes nicht mit dem Typ von origRequest übereinstimmt. Verwenden Sie stattdessen * origRequest und das Problem verschwindet. –

+0

Sie haben Recht: Derefencing mit dem Stern oder mithilfe einer Referenz in der Struktur hilft. Vielen Dank. – deamon

6

Wie Jeremy oben zeigt, ist der "Name" eines anonymen Feldes derselbe wie der Typ des Feldes. Wenn also der Wert von x eine Struktur mit einem anonymen int wäre, würde sich x.int auf dieses Feld beziehen.

Verwandte Themen