2017-02-10 39 views
0

我有以下代碼來加倍切片。如何確定切片接口{}的元素類型?

func doubleSlice(s []int) []int { 
    t := make([]int, len(s), (cap(s) + 1) * 2) 
    for i := range s { 
    t[i] = s[i] 
    } 
    return t 
} 

我想使功能加倍任何類型的切片。我首先需要知道元素類型。

func showInterfaceItem(s interface{}) interface{} { 
    if reflect.TypeOf(s).Kind() != reflect.Slice { 
    fmt.Println("The interface is not a slice.") 
    return 
    } 

    var t interface{} 
    newLen := reflect.ValueOf(s).Len() 
    newCap := (cap(reflect.ValueOf(s).Cap()) + 1) * 2 
    t = make([]reflect.TypeOf(s), newLen, newCap) 

    return t 
} 

reflect.TypeOf(s)返回接口{類型},而不是元件的類型。我如何獲得切片界面的元素類型?

+0

這不是完全清楚你已經嘗試過?你在一個沒有迴歸變量的函數中返回值? 'func showInterfaceItem(s interface {})({{here here}}){' – silvergasp

+0

我想實現自動檢查元素類型。如果's'是'[] int','t'是'[] int'。如果's'是'[] float32','t'是'[] float32'。 – firelyu

+0

我想你誤解了我的問題......你的函數不會編譯。它正在返回一個值'return t',但是沒有返回值是你的函數 – silvergasp

回答

1

您可以使用reflect.TypeOf(s).Elem() 獲得片元素的類型。

package main 

import (
    "fmt" 
    "reflect" 
) 

func doubleSlice(s interface{}) interface{} { 
    if reflect.TypeOf(s).Kind() != reflect.Slice { 
     fmt.Println("The interface is not a slice.") 
     return nil 
    } 

    v := reflect.ValueOf(s) 
    newLen := v.Len() 
    newCap := (v.Cap() + 1) * 2 
    typ := reflect.TypeOf(s).Elem() 

    t := reflect.MakeSlice(reflect.SliceOf(typ), newLen, newCap) 
    reflect.Copy(t, v) 
    return t.Interface() 
} 

func main() { 
    xs := doubleSlice([]string{"foo", "bar"}).([]string) 
    fmt.Println("data =", xs, "len =", len(xs), "cap =", cap(xs)) 

    ys := doubleSlice([]int{3, 1, 4}).([]int) 
    fmt.Println("data =", ys, "len =", len(ys), "cap =", cap(ys)) 
} 

輸出將是:

data = [foo bar] len = 2 cap = 6 
data = [3 1 4] len = 3 cap = 8 

檢查它在:Go Playground

+0

'reflect.MakeSlice()'和'reflect.Sliceof()'是我需要的。與他們一起,我執行我的計劃。 – firelyu

相關問題