2015-10-10 29 views
0

我想写一个函数,可以将slice([] int,[] string,[] bool,[] int64,[] float64)转换为字符串。golang - 如何从界面{}类型的切片中获取元素?

[]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 "" 
} 

但它是一个有点复杂,如果我可以转换接口{}(类型片)为[]接口{}或获取元素,它变得更简单。

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 
} 

回答

0

你不能这样做,因为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工作,但在途中,你失去了很多的方便调用者。