将参数设置为接口或接口列表

时间:2014-10-28 14:08:36

标签: interface go signature

我是Go的新手,还有一些我还没有实现的潜力

例如,我有一个可以这样调用的函数:

myVar.InitOperation("foo",Operator.EQUAL,"bar")
myVar.InitOperation("foo",Operator.INCLUDE,[]interface{}{"baz",1,"boo"})
myVar.InitOperation("foo",Operator.GREATER_THAN,1)

所以我将此函数声明为:

func InitOperation(attr string, operator Operator, value interface{}){
    if operator.String() == "BAR"{
        doSomething(attr,operator,value)
    } else if (operator.String() == "INCLUDE" {
        doSomethingElse(attr,operator,value)
    }
    // And so on regarding to the case
}

问题是,当我传递一个字符串或一个整数时,它会很顺利,但是当我传递一个数组时,它会被解析为一个元素。

在我的函数doSomethingElse中,我试图迭代values,正如您可能猜到的,我有一个错误。

很好,我只是将values设为[]interface{}而不是interface{}。在这里,一切顺利,但是当我调用doSomething时,它被解析为[[myValue]]这是合乎逻辑的,但不是我期望的。

我的问题是,有没有办法传递一个[]interface{}interface{}谁可以是红色作为值或一组值的情况?

谢谢!

1 个答案:

答案 0 :(得分:2)

你需要一个类型断言:

func InitOperation(attr string, operator Operator, value interface{}){
    if operator.String() == "BAR"{
        doSomething(attr,operator,value)
    } else if (operator.String() == "INCLUDE" {
        doSomethingElse(attr, operator, value.([]interface{}))
    }
    // And so on regarding to the case
}

func doSomethingElse(attr string, operator Operator, value []interface{}) {
    for _, v := range value {
        fmt.Println(v)
    }
}