0

要求:

type A struct {//some code}
type B struct {//some code}

func getData(db string) interface{} {
    if db == "dbA" {     // problem with this if condition
        type C A
    } else {
        type C B
    }
    var byteData []byte
    query := //cassandra query object
    iter := query.Iter()
    for iter.Scan(&byteData) {
        myObject := new(C)
        err := proto.Unmarshal(byteData, myObject)
        objects = append(objects, myObject)
    }
    return objects
}

基本上,我不想在循环内写 if 条件。但是 myObject 是在 C 的范围之外声明的。

另一种方法:我尝试将 myObject 的类型设置为 proto.Message,但这给了我错误“无效的内存地址或 nil 指针取消引用”

myObject := new(proto.Message)
err := proto.Unmarshal(byteData, myObject)
objects = append(objects, myObject)

另一个替代方案:我也不确定使用相同的变量是否有效(因此我每次都尝试在循环内创建一个新变量)

PS:这个不需要太多的Cassandra知识

帮助表示赞赏。谢谢 !

编辑1:我想要完成的是从数据库中获取几行。但由于我有多个表包含非常相似的数据,我想以一种非常优化的方式在一个函数中完成它。我要获取的值以字节存储,我使用 proto 将其转换为 Golang 对象。

编辑 2:proto.Unmarshal 需要第二个参数是 proto.Message 类型。因此我不能使用空接口。(A型和B型都实现了proto.Message)

编辑 3:您可以在“github.com/golang/protobuf”找到 proto。我用它把对象转换成字节,也转换回对象。!

4

1 回答 1

2

在 Go 的类型系统中,你想要实现的东西不能直接完成。

但是,借助interface{}一流的函数值,我们可以完成它,而且相当优雅。

为此type C,我们声明一个新的构造函数,而不是声明一个新的:

var newC func() interface{}
if true {
    newC = func() interface{} {
        c := new(A)
        return c
    }
} else {
    newC = func() interface{} {
        c := new(B)
        return c
    }
}

然后,在循环中,更改myObject := new(C)myObject := newC(). 它完成了。

示例: https: //play.golang.org/p/dBKBYrLqi_P

编辑:

由于您需要将参数设置为 a proto.Message,我猜是 a interface,因此您可以将其转换为proto.Message.

所以基本上你可以将你的代码重写为:

type A struct {//some code}
type B struct {//some code}

func getData(db string) interface{} {
var newC func() interface{}
if true {
    newC = func() proto.Message {
        c := new(A)
        return c
    }
} else {
    newC = func() proto.Message {
        c := new(B)
        return c
    }
}
var byteData []byte
    query := //cassandra query object
    iter := query.Iter()
    for iter.Scan(&byteData) {
        myObject := newC()
        err := proto.Unmarshal(byteData, myObject)
        objects = append(objects, myObject)
    }
    return objects
}
于 2018-07-09T05:04:41.687 回答