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

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}}
- 2 回答
- 0 關注
- 89 瀏覽
添加回答
舉報