【问题标题】:Use a function with a scalar or slice使用带有标量或切片的函数
【发布时间】:2015-11-11 11:15:58
【问题描述】:

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

func T_conv(T ...interface{}) []interface{} {
    var r []interface{} = make([]interface{}, len(T))
    for i, v := range T {
        fmt.Printf("Ind: %d Result: %v, type: %T\n", i, v, v)
        r[i] = v.(float64) * 1.00024
    }
    return r
}

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

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

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

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

结果:
Ind:0 结果:[20 21],类型:[]float64
恐慌:接口转换:接口是[]float64,而不是float64

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

【问题讨论】:

    标签: go interface slice


    【解决方案1】:

    您的方法,已更正

    您的问题是,如果您将切片传递给 T_conv() 函数,在 T_conv() 内部,它将是 T 切片参数的第一个元素。传递的切片与T 不同。所以如果你想让它工作,那么你必须使用Type assertionT[0]获取[]float64,并对其进行迭代。

    类似这样的: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
    

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 2014-05-28
      • 2012-01-17
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多