2015-10-10 55 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工作,但在途中,你失去了很多的方便調用者。