2012-09-21 21 views
22

Mam następujący struct który zawiera net/http.Request:Initialize osadzone struct Przejdź

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

Teraz chcę zainicjować anonimowy wewnętrzną struct http.Request w następującej funkcji:

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

Jak mogę zainicjować wewnętrzną strukturę za pomocą parametru origRequest?

Odpowiedz

10

Co o:

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

To pokazuje, że zamiast

New(foo, bar) 

może wolisz tylko

&MyRequest{*foo, bar} 

bezpośrednio.

+1

Co powiesz na pytanie, kiedy jest jakieś pole, którego nie chcesz zainicjować samodzielnie, np. Plik typu sync.Mutex? –

+0

Wartość zero mutex mutex powinien być gotowy do użycia, więc jesteś dobry w tym po prostu go jako osadzonego wartości: 'struct {var uderza sync.Mutex n int } trafień. Zablokuj() hits.n ++ hits.Unlock() ' (od [10 rzeczy prawdopodobnie nie wiedziałeś o Go] (https://talks.golang.org/2012/10things.slide#3)) – Alaska

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

lub ...

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

Patrz: http://golang.org/ref/spec#Struct_types się więcej o osadzanie i na pola, jak się nazywa.

+0

Występuje błąd kompilatora "nie można użyć parametru origRequest (typ * http.Request) jako typ http.Request w przypisaniu'. Chyba dlatego, że 'Request' nie jest polem nazwanym. – deamon

+3

nie, ponieważ typ pola nie jest taki sam jak typ origRequest. Zamiast tego użyj * origRequest, a problem zniknie. –

+0

Masz rację: usuwanie gwiazdką lub użycie odniesienia w strukturze pomaga. Dzięki. – deamon

6

Jak pokazuje powyższy Jeremy, "nazwa" anonimowego pola jest taka sama jak typ pola. Więc jeśli wartość x byłaby strukturą zawierającą anonimowy int, to x.int odnosiłby się do tego pola.