无法将结构转换为具有相同基础字段的不同类型

type Req struct {
    apiVersion       string
    path             string
    resourceEndpoint string
    accessKey        string
    log              *logrus.Entry
    incomingReq      interface{}
    httpClient       lib.HTTPClient
    redisClient      redis.Cmdable
    ctx              context.Context
} 

type TestReq struct {
    Req
}

根据this this question及其答案,我觉得我应该能够做到以下几点:

req := &Req{}
req = TestReq(req)

但是我在 VsCode 中收到此错误:

无法将 req(*Req 类型的变量)转换为 TestReq 编译器(InvalidConversion)

这两个结构体是否具有相同的底层字段?如果是这样,为什么第一个不能转换为第二个?

回答

这两个结构体是否具有相同的底层字段?

不,他们没有。Req有几个字段,TestReq有一个类型的字段,Req所以它们不能相互转换。嵌入不会将嵌入类型的字段“复制”到嵌入器类型。嵌入会添加一个字段,该字段可以由其类型的非限定类型名称引用。

嵌入的使用不是自动“复制”字段,而是让它们“提升”,同时提升嵌入类型的方法。

如果您有一个 type 值TestReq,您可以使用非限定类型名称Req来引用嵌入字段,因此您可以执行以下操作:

var tr TestReq
var r Req

r = tr.Req // Valid

tr.Req = r // This is also valid

上述操作(语句)是赋值 ,因此,它们复制整个Req结构值。如果你想避免这种情况,你可以嵌入一个指针,例如:

type TestReq struct {
    *Req
}

然后下面的赋值只会复制一个指针值:

var tr = &TestReq{Req: &Req{}}
var r *Req

r = tr.Req // Valid

tr.Req = r // This is also valid

(注意:这里tr本身可能是也可能不是指针,这无关紧要。)

  • 在我的回答中,`r` 的类型是 `Req`,其中 `&Req{}` 是一个指针,它的类型是 `*Req`。“可打印”是什么意思?

以上是无法将结构转换为具有相同基础字段的不同类型的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>