亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法將結構轉換為具有相同基礎字段的不同類型的結構

無法將結構轉換為具有相同基礎字段的不同類型的結構

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 關注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號