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

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 question 及其答案,我觉得我应该能够执行以下操作:

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

但我在 VsCode 中收到此错误:

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

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

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

这两个结构体的底层字段不一样吗?

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

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

如果你有一个 TestReq 类型的值,你可以使用非限定类型名称 Req 来引用嵌入的字段,所以你可以这样做:

var tr TestReq
var r Req

r = tr.Req // Valid

tr.Req = r // This is also valid

上述操作(语句)是 assignments,因此,它们复制整个 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 本身可能是也可能不是这里的指针,无所谓。)

,

基于 icza 的建议,使用类型名称 req 为嵌入字段赋值。这里是一个简单的代码,为了简单起见,我将 redis、logrus、context 和 http 类型转换为接口{}

package main

import (
    "fmt"
)

type Req struct {
    apiVersion       string
    path             string
    resourceEndpoint string
    accessKey        string
    log              interface{}
    incomingReq      interface{}
    httpClient       interface{}
    redisClient      interface{}
    ctx              interface{}
}

type TestReq struct {
    Req
}

func main() {

    req1 := Req{"api01","c:/doc/folder","endkey","ackey","logs",[2]float64{2.0,7.88},"http","redis","ctx"}
    fmt.Println("ReqObject",req1)

    var testReq TestReq
    testReq.Req = req1
    fmt.Println("TestReqObject",testReq)
}

输出:

ReqObject {api01 c:/doc/folder endkey ackey logs [2 7.88] http redis ctx}
TestReqObject {{api01 c:/doc/folder endkey ackey logs [2 7.88] http redis ctx}}
本文链接:https://www.f2er.com/72108.html

大家都在问