为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
喵喔喔 2022-09-12 21:03:59
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}根据这个问题及其答案,我觉得我应该能够做到以下几点:req := &Req{}req = TestReq(req)但我在VsCode中收到此错误:无法将请求(*Req 类型的变量)转换为测试请求编译器(无效转换)这两个结构不是具有相同的基础字段吗?如果是这样,为什么不能将第一个转换为第二个?
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这两个结构不是具有相同的基础字段吗?


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


嵌入的使用不是自动“复制”fiels,而是让它们“提升”,也促进嵌入类型的方法。


如果值为 type ,则可以使用非限定类型名称来引用嵌入字段,因此可以执行如下操作:TestReqReq


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


查看完整回答
反对 回复 2022-09-12
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

根据 icza 的建议,使用类型名称 req 将值赋给嵌入字段。这是一个简单的代码,为了简单起见,我将redis,logrus,上下文和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}}


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号