我想将函数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
答案 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