背景
我已经做了大量的规范阅读和代码测试,我认为答案是否定的,但我想确保我没有遗漏任何东西.
目标
基本上,我正在尝试为Go创建一个Active Record样式的ORM,因为我喜欢它的可读性以及它是如何从后端数据存储中抽象出来的.我宁愿写user.Save()不是data.Save(user)通过嵌入用户结构共同CRUD方法.
例
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()
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/cWyqqVSKGH
题
有没有办法让嵌入式方法可以访问顶级字段(不确定Go中的正确术语是什么)(例如:s.Name或s.Method()?
谢谢你把时间捐给新的Gopher.
Go 不为您所追求的提供任何支持:Test方法的接收者是一个Bar指针,并且无法判断它是否是嵌入的。
如果您确实想走这条路线,一种选择是添加一个interface{}成员Bar并要求将其设置为包含类型。初始化该成员可能是创建该值的人的责任,也可能需要调用者将值传递给某个 ORM 方法来设置它。这不是特别漂亮,但这可能是你能做的最好的了。
既然如此,将 API 构建为而db.Save(user)不是真的那么糟糕吗user.Save()?前者提供了一种扩展到多个数据库的明显方法,而后者似乎更可能依赖于全局状态。