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 关注
- 94 浏览
添加回答
举报