这两个结构体的底层字段不一样吗?
不,他们没有。 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