Struct 在Go中初始化嵌入式结构

Struct 在Go中初始化嵌入式结构,struct,go,Struct,Go,我有以下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)

我有以下
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
初始化内部结构

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

有关嵌入和字段命名方式的更多信息,请参阅。

关于:

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

New(foo, bar)
你可能更喜欢

&MyRequest{*foo, bar}

直接。

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

我得到编译器错误
无法将origRequest(type*http.Request)用作赋值中的http.Request类型
。我想这是因为
Request
不是一个命名字段。不,这是因为字段的类型与origRequest的类型不同。使用*origRequest,问题就消失了。你是对的:用星号解除隔离或在结构中使用引用会有帮助。谢谢。至于字段的命名方式:“非限定类型名称充当字段名称。”因此
http.Request
最终只被调用
Request
。如果有一些字段您不想自己初始化,例如sync.Mutex类型的文件,该如何处理?Mutex的零值应该是一个随时可用的Mutex,因此,只需将其作为嵌入值包含即可:
var hits struct{sync.Mutex n int}hits.Lock()hits.n++hits.Unlock()
(from)此示例显示了推荐的另一种方法
&MyRequest{*foo, bar}