2012-09-21 26 views
22

Ho il seguente struct che contiene un net/http.Request:Inizializza struct incorporato in Go

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

Ora voglio inizializzare il anonima struct interna http.Request nella seguente funzione:

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

Come posso inizializzare la struttura interna con il parametro origRequest?

risposta

10

Che dire:

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

Essa mostra che, invece di

New(foo, bar) 

si potrebbe preferire appena

&MyRequest{*foo, bar} 

direttamente.

+1

E quando ci sono dei campi che non vuoi inizializzare, ad es. Un file di tipo sync.Mutex? –

+0

Il valore zero di un mutex dovrebbe essere un mutex pronto per l'uso, in modo da sta bene semplicemente compreso come un valore intrinseco: 'var colpisce struct { sync.Mutex n int } colpi. Blocca() hits.n ++ hits.Unlock() ' (da [10 cose che probabilmente non conoscevi su Go] (https://talks.golang.org/2012/10things.slide#3)) – Alaska

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

o ...

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

See: http://golang.org/ref/spec#Struct_types info sui inclusione e come i campi vengono di nome.

+0

Viene visualizzato l'errore del compilatore 'impossibile utilizzare origRequest (tipo * http.Request) come tipo http.Richiedi nell'assegnazione'. Immagino che questo sia dovuto al fatto che 'Request' non è un campo con nome. – deamon

+3

no, perché il tipo di campo non è uguale al tipo di origRequest. Usa invece * origRequest e il problema scompare. –

+0

Hai ragione: la dissuasione con l'asterisco o l'utilizzo di un riferimento nella struttura aiuta. Grazie. – deamon

6

Come mostra Jeremy sopra, il "nome" di un campo anonimo è uguale al tipo del campo. Quindi se il valore di x fosse una struct contenente un int anonimo, allora x.int si riferirebbe a quel campo.

Problemi correlati