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

嵌入式方法可以访问“父”字段吗?

嵌入式方法可以访问“父”字段吗?

Go
富国沪深 2021-07-09 14:15:19
背景我已经做了大量的规范阅读和代码测试,我认为答案是否定的,但我想确保我没有遗漏任何东西。目标基本上,我正在尝试为 Go 创建一个 Active Record 风格的 ORM,因为我喜欢它的可读性以及它从后端数据存储中的抽象程度。我宁愿编写而user.Save()不是data.Save(user)在用户结构上嵌入常见的 CRUD 方法。例子package mainimport (    "fmt"    "reflect")func main() {    test := Foo{Bar: &Bar{}, Name: "name"}    test.Test()}type Foo struct {    *Bar    Name string}func (s *Foo) Method() {    fmt.Println("Foo.Method()")}type Bar struct {}func (s *Bar) Test() {    t := reflect.TypeOf(s)    v := reflect.ValueOf(s)    fmt.Printf("model: %+v %+v %+v\n", s, t, v)    fmt.Println(s.Name)    s.Method()}http://play.golang.org/p/cWyqqVSKGH问题有没有办法让顶级字段(不确定 Go 中的正确术语是什么)从嵌入式方法(例如:s.Name或s.Method()?感谢您为新 Gopher 贡献您的时间。
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

Go 不为您所追求的提供任何支持:您的Test方法的接收者是一个Bar指针,并且无法判断它是否被嵌入。

如果你真的想走这条路,一个选择是添加一个interface{}成员Bar并要求将其设置为包含类型的类型。初始化这个成员可能是创建值的人的责任,或者可能需要调用者将值传递给某个 ORM 方法来设置它。这不是特别漂亮,但它可能是你能做的最好的。

顺便说一句,将 API 构建为db.Save(user)而不是真的那么糟糕user.Save()吗?前者提供了一种扩展到多个数据库的明显方法,而后者似乎更可能依赖于全局状态。


查看完整回答
反对 回复 2021-07-12
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

(如果我正确理解您的问题,)不,嵌入不是继承。听起来你真正想要的是一个界面

type Saver interface {
    Save() error}

然后相关方可以实施。

您可以拥有一个公共结构base或任何实现公共方法的结构,然后可以嵌入每个更高级别的结构base以允许它们共享实现。


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信