2012-09-21 20 views
22

Tengo el siguiente struct que contiene una net/http.Request:Inicializar estructura incrustada en Ir

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

Ahora quiero inicializar la estructura interna anónima http.Request en la siguiente función:

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

¿Cómo puedo inicializar la estructura interna con el parámetro origRequest?

Respuesta

10

¿Qué hay de:

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

Esto demuestra que en lugar de

New(foo, bar) 

es posible que prefiera simplemente

&MyRequest{*foo, bar} 

directamente.

+1

¿Qué tal si hay algún campo que no desea inicializar, por ejemplo, un archivo de tipo sync.Mutex? –

+0

El valor cero de una exclusión mutua debe ser un mutex lista para su uso, por lo que ya está bueno simplemente incluyéndolo como un valor intrínseco: 'var golpea struct { sync.Mutex NInt } éxitos. Bloquear() hits.n ++ hits.Unlock() ' (de [10 cosas que probablemente no sabía acerca de Ir] (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 
} 

Ver: http://golang.org/ref/spec#Struct_types para obtener más información sobre la inserción y cómo los campos consiguen llamado.

+0

Aparece el error del compilador 'no se puede usar origRequest (tipo * http.Request) como tipo http.Request in assignment'. Supongo que esto es porque 'Solicitud' no es un campo con nombre. – deamon

+3

no es porque el tipo del campo no es el mismo que el tipo de origRequest. Use * origRequest en su lugar y el problema desaparece. –

+0

Tiene usted razón: quitar el enderezado con el asterisco o usar una referencia en la estructura ayuda. Gracias. – deamon

6

Como muestra Jeremy más arriba, el "nombre" de un campo anónimo es el mismo que el tipo del campo. Entonces, si el valor de x fuera una estructura que contiene un int anónimo, entonces x.int se referiría a ese campo.

Cuestiones relacionadas