【问题标题】:golang - how to get element from the interface{} type of slice?golang - 如何从 interface{} 类型的切片中获取元素?
【发布时间】:2015-10-10 03:27:05
【问题描述】:

我想写一个可以将 slice([]int, []string, []bool, []int64, []float64) 转换为字符串的函数。

[]string{a,b,c} -> a,b,c
[]int{1,2,3}    -> 1,2,3

还有我的code:

func sliceToString(itr interface{}) string {
    switch itr.(type) {
    case []string:
        return strings.Join(itr.([]string), ",")
    case []int:
        s := []string{}
        for _, v := range itr.([]int) {
            s = append(s, fmt.Sprintf("%v", v))
        }
        return strings.Join(s, ",")
    case []int64:
        s := []string{}
        for _, v := range itr.([]int64) {
            s = append(s, fmt.Sprintf("%v", v))
        }
        return strings.Join(s, ",")
    case []float64:
        s := []string{}
        for _, v := range itr.([]float64) {
            s = append(s, fmt.Sprintf("%v", v))
        }
        return strings.Join(s, ",")
    case []bool:
        s := []string{}
        for _, v := range itr.([]bool) {
            s = append(s, fmt.Sprintf("%v", v))
        }
        return strings.Join(s, ",")
    }

    return ""
}

但这有点复杂,如果我可以将 interface{}(type is slice) 转换为 []interface{} 或 get element ,它会变得更加简单。

 func sliceToString(itr interface{}) string {
    s := []string{}
    // convert interface{} to []interface{} or get elements
    // els := ...
    for _,v:= range els{
       s = append(s, fmt.Sprintf("%v", v))
    }
    return s
 }

【问题讨论】:

    标签: go


    【解决方案1】:

    你不能这样做,因为 int、string 或任何东西的切片不能直接转换为接口切片。 (请参阅that question 了解更多说明)。

    要进行转换,您需要将切片的每个项目分别转换为interface{}。如果不先转换为切片,您就无法访问这些项目,但为此您需要知道切片的类型(所以我们回到方形)。

    缩短语法的一种方法是将接口切片作为参数,并让调用者进行转换(因为调用者知道切片的类型)。这是一个例子:https://play.golang.org/p/6yLYk1OM25

    package main
    
    import (
        "fmt"
        "strings"
    )
    
    func main() {
        mySlice := []int{1, 2, 3}
    
        interfaceSlice := make([]interface{}, len(mySlice))
        for index := range mySlice {
            interfaceSlice[index] = mySlice[index]
        }
    
        fmt.Println(sliceToString(interfaceSlice))
    }
    
    func sliceToString(values []interface{}) string {
        s := make([]string, len(values)) // Pre-allocate the right size
        for index := range values {
            s[index] = fmt.Sprintf("%v", values[index])
        }
        return strings.Join(s, ",")
    }
    

    这将适用于mySlice 的任何切片,但在此过程中您会为调用者失去很多便利。

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 2016-05-19
      • 2016-09-16
      • 2016-03-10
      • 2018-08-03
      • 2016-12-03
      • 2015-04-19
      • 2014-08-08
      • 2020-08-10
      相关资源
      最近更新 更多