背景
我已经进行了大量的规范阅读和代码测试,我认为答案是否定的,但我想确保我没有遗漏任何内容。
目标
基本上,我正在尝试为 Go 创建一个 Active Record 风格的 ORM,因为我喜欢它的可读性以及它从后端数据存储中提取的程度。我宁愿通过在用户结构上嵌入常见的 CRUD 方法来编写 user.Save()
而不是 data.Save(user)
。
示例
package main
import (
"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 付出宝贵的时间。
最佳答案
Go 不为您所追求的提供任何支持:您的 Test
方法的接收者是一个 Bar
指针,并且没有办法判断是否是否嵌入。
如果您真的想走这条路,一个选择是将 interface{}
成员添加到 Bar
并要求将其设置为包含的类型类型。初始化这个成员可能是创建值的人的责任,或者可能需要调用者将值传递给某个 ORM 方法来设置它。这不是特别漂亮,但它可能是您能做的最好的。
除此之外,将 API 构造为 db.Save(user)
而不是 user.Save()
真的那么糟糕吗?前者提供了一种扩展到多个数据库的明显方式,而后者似乎更可能依赖于全局状态。
关于go - 嵌入式方法可以访问 "parent"字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20167935/