使用带标量或切片的函数

时间:2015-08-18 13:26:04

标签: go interface slice

我想将函数T_conv与浮点数或浮点数一起使用。 此示例使用float作为T_conv的参数:

func main() {
    v := T_conv([]float64{20.0, 21.0})
    fmt.Printf("Result: %v, type: %T\n", v, v)
}

http://play.golang.org/p/YhdFoXyY_e

但在运行时以切片作为参数失败:

/me?fields=name,email,gender,age_range,picture,location{location}

结果:
Ind:0结果:[20 21],输入:[] float64
恐慌:界面转换:界面是[] float64,而不是float64

http://play.golang.org/p/3DP96EamxW

1 个答案:

答案 0 :(得分:2)

您的方法,已更正

在您的情况下,问题是如果您将切片传递到T_conv()函数,在T_conv()内,它将是T切片参数的第一个元素。传递的切片与T不同。因此,如果您想让它发挥作用,那么您必须使用Type assertion[]float64获取T[0],并对其进行迭代。

像这样:Go Playground

func T_conv(T ...interface{}) []interface{} {
    if len(T) == 0 {
        return []interface{}{}
    }

    if f, ok := T[0].(float64); ok {
        return []interface{}{f * 1.00024}
    } else if fs, ok := T[0].([]float64); ok {
        var r []interface{} = make([]interface{}, len(fs))
        for i, v := range fs {
            r[i] = v * 1.00024
        }
        return r
    }

    return nil
}

但我推荐以下解决方案。

推荐方法

对于具有可变参数的函数,输入问题是一个完美的用例:

func Conv(in ...float64) []float64 {
    out := make([]float64, len(in))
    for i, v := range in {
        out[i] = v * 1.00024
    }
    return out
}

使用它:

请注意,在将切片传递给它时必须使用...。阅读更多:Passing arguments to ... parameters。您甚至可以通过枚举浮点数来调用它(不将它们包装在切片中)。

v := Conv(1.0)
fmt.Printf("Result: %v, type: %T\n", v, v)

v = Conv([]float64{20.0, 21.0}...)
fmt.Printf("Result: %v, type: %T\n", v, v)

v = Conv(20.0, 21.0)
fmt.Printf("Result: %v, type: %T\n", v, v)

输出(在Go Playground上尝试):

Result: [1.00024], type: []float64
Result: [20.0048 21.00504], type: []float64
Result: [20.0048 21.00504], type: []float64