go - 嵌入式方法可以访问 "parent"字段吗?

标签 go

背景

我已经进行了大量的规范阅读和代码测试,我认为答案是否定的,但我想确保我没有遗漏任何内容。

目标

基本上,我正在尝试为 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.Names.Method ()?

感谢您为新的 Gopher 付出宝贵的时间。

最佳答案

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

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

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

关于go - 嵌入式方法可以访问 "parent"字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20167935/

相关文章:

performance - 为什么这个程序在使用 goroutines 时表现不佳?

go - 您可以为 Cobra 中的标志指定可选参数吗?

string - 这两个err值有什么区别?

mysql - Golang - 从 MySQL 存储/检索小数

go - 了解 etcd Leader 选举 API

unit-testing - 如何在不创建实际网络连接的情况下测试依赖于 net.Conn 的代码?

string - 规范包 : how do I combine separate characters?

go - 有没有办法附加两个 go interface{} 引用?

go - reflect.TypeOf 是 *string 并返回 0xc0001ae4a8 - 如何打印

go - 反射(reflect)返回值