嵌入式方法可以访问父字段吗?
在 Go 中,嵌入式方法是代码重用和组织的强大机制。但是,出现了一个常见问题:嵌入式方法可以直接访问其父结构体的字段吗?
背景
对于上下文,假设您正在创建一个 Active Record - Go 的风格 ORM,其中常见的 CRUD 方法嵌入在用户结构中以提高可读性和抽象性。这将允许您编写 user.Save() 而不是 data.Save(user)。
示例
考虑以下代码片段:
重新审视问题
问题问题在于是否有办法使顶级字段可以通过嵌入式方法访问。在上面的示例中,Test 方法嵌入在 Bar 中,并尝试从父 Foo 结构体访问 Name 字段。
Answer
不幸的是,Go 不提供嵌入式方法访问其父结构体字段的任何直接机制。 Test方法的接收者是一个指向Bar的指针,Go没有办法判断它是否嵌入。
可能的解决方案
实现对于此功能,一个潜在的解决方法是向 Bar 结构添加一个 interface{} 成员,要求实现它的类型将该成员设置为包含类型。该成员的初始化可以由调用者负责,也可以通过 ORM 方法处理。然而,这种方法引入了额外的复杂性和潜在的维护问题。
替代视角
或者,考虑将 API 构造为 db.Save(user) 可能不会的可能性正如看起来那样有害。这种方法提供了一种支持多个数据库的简单方法,并避免依赖全局状态。
以上是嵌入式 Go 方法可以访问父结构体字段吗?的详细内容。更多信息请关注PHP中文网其他相关文章!