Reputation: 92549
I have the following struct
which contains a net/http.Request
:
type MyRequest struct {
http.Request
PathParams map[string]string
}
Now I want to initialize the anonymous inner struct http.Request
in the following function:
func New(origRequest *http.Request, pathParams map[string]string) *MyRequest {
req := new(MyRequest)
req.PathParams = pathParams
return req
}
How can I initialize the inner struct with the parameter origRequest
?
Upvotes: 48
Views: 45601
Reputation: 1450
Just for completeness sake, I'll add another example as well. Based on the comment from @Victor
This example shows another way recommended https://play.golang.org/p/Gbn8e6CTVi_c
type MyRequest struct {
http.Request
PathParams map[string]string
}
func New(origRequest *http.Request, pathParams map[string]string) *MyRequest {
req := MyRequest{Request: origRequest, PathParams: pathParams}
return req
}
Another comment from @Jeffery Martinez helped clarify it further:
As for how the fields get named: "The unqualified type name acts as the field name." So
http.Request
ends up being called justRequest
i.e: The two following declarations are equivalent
// Version 1
type MyRequest struct {
http.Request
PathParams map[string]string
}
// Version 2
type MyRequest struct {
Request http.Request
PathParams map[string]string
}
Upvotes: 2
Reputation: 1424
As Jeremy shows above, the "name" of an anonymous field is the same as the type of the field. So if the value of x were a struct containing an anonymous int, then x.int would refer to that field.
Upvotes: 7
Reputation: 91409
What about:
func New(origRequest *http.Request, pathParams map[string]string) *MyRequest {
return &MyRequest{*origRequest, pathParams}
}
It shows that instead of
New(foo, bar)
you might prefer just
&MyRequest{*foo, bar}
directly.
Upvotes: 21
Reputation: 25255
req := new(MyRequest)
req.PathParams = pathParams
req.Request = origRequest
or...
req := &MyRequest{
PathParams: pathParams
Request: origRequest
}
See: http://golang.org/ref/spec#Struct_types for more about embedding and how the fields get named.
Upvotes: 45