初始化Go中的嵌入结构

yi0zb3m4  于 2023-05-11  发布在  Go
关注(0)|答案(4)|浏览(168)

我有下面的struct,它包含一个net/http.Request

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

现在我想在下面的函数中初始化匿名内部结构http.Request

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

如何使用参数origRequest初始化内部结构体?

jjhzyzn0

jjhzyzn01#

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

或者...

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

请参阅:http://golang.org/ref/spec#Struct_types了解有关嵌入和字段如何命名的更多信息。

wmvff8tz

wmvff8tz2#

关于:

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

它表明,与其

New(foo, bar)

你可能更喜欢

&MyRequest{*foo, bar}

直接。

lmyy7pcs

lmyy7pcs3#

正如Jeremy上面所示,匿名字段的“名称”与字段的类型相同。因此,如果x的值是一个包含匿名int的结构体,那么x.int将引用该字段。

c86crjj0

c86crjj04#

为了完整起见,我还将添加另一个示例。根据@维克托的评论
此示例显示了推荐的另一种方式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
}

@Jeffery Martinez的另一条评论帮助进一步澄清了这一点:
至于字段如何命名:“非限定类型名充当字段名。”因此http.Request最终被称为Request
即:以下两个声明是等效的

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

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

相关问题