deamon
deamon

Reputation: 92549

Initialize embedded struct in Go

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

Answers (4)

Vance Palacio
Vance Palacio

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 just Request

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

Matt
Matt

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

zzzz
zzzz

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

Jeremy Wall
Jeremy Wall

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

Related Questions