Golang 傳遞任意類型的切片

確定有這樣的一種場景,寫一個函數,該函數能夠接收任意類型的切片,完成相應的功能。函數

就比如這種狀況.net

intSlice := []int{1,2,3,4,5,6,7,8}
strSlice := []string{"a","b","c","d"}
boolSlice := []bool{true,true,false,true}

還有不少類型的切片,可是我對這些切片的使用,只是for循環每個元素,執行Print操做就能夠了。
那就定義一個函數,函數的接收參數就是這個切片就好了,可是切片類型太多了,你要根據不一樣的切片類型,寫不一樣從接收參數類型,可是函數體的代碼都是同樣,for循環,而後Print就能夠。那麼有沒有一種類型,能夠接收全部類型的參數呢?code

interface{}: 空接口這個類型,他能夠接收任意類型的數據blog

func faa (arg interface{}) {
    fmt.Println(arg)
}

func main() {
    
    faa(intSlice)   
    faa(strSlice)
    faa(boolSlice)  // 可以成功輸出,不會報錯
}

可是將faa的函數體改下,執行for操做接口

func faa (arg interface{}) {
    for _,v := range arg {
        fmt.Println(v)
    }
}

運行程序,會報錯,報錯信息:cannot range over arg (type interface {}), interface {}類型不能進行for循環,,那麼[] interface {}這種切片類型就能夠進行for了吧,ci

func faa (arg []interface{}) {
    for _,v := range arg {
        fmt.Println(v)
    }
}

func main() {
    
    faa(intSlice)   
    faa(strSlice)
    faa(boolSlice)  
}

這樣的狀況的話,咱們在調用faa函數的時候,已經報錯了,說類型不對,faa的接收參數類型爲[]interface{},但我傳遞的參數類型爲[]int,[]string,[]bool。因此這樣是不行的。get

下面是解決方法:博客

  • 首先faa接收的參數類型爲 interface{}
  • 將arg進行轉化,轉爲[]interface{}
  • 最後進行for循環操做

直接貼代碼,我是參考別人的string

該博主的博客: https://blog.csdn.net/HaoDaWang/article/details/83931629for循環

// interface{}轉爲 []interface{}
func CreateAnyTypeSlice(slice interface{}) ([]interface{}, bool) {
    val, ok := isSlice(slice)

    if !ok {
        return nil, false
    }

    sliceLen := val.Len()

    out := make([]interface{}, sliceLen)

    for i := 0; i < sliceLen; i++ {
        out[i] = val.Index(i).Interface()
    }

    return out, true
}

// 判斷是否爲slcie數據
func isSlice(arg interface{}) (val reflect.Value, ok bool) {
    val = reflect.ValueOf(arg)

    if val.Kind() == reflect.Slice {
        ok = true
    }

    return
}


// 看需求寫的代碼
func faa(arg interface{}) {
    slice, ok := CreateAnyTypeSlice(arg)
    if !ok {
        return
    }
    for index,value := range slice {
        fmt.Println(index,value)
    }
}

func main() {
    
    intSlice := []int{1,2,3,4,5,6,7,8}
    strSlice := []string{"a","b","c","d"}
    boolSlice := []bool{true,true,false,true}
    
    
    faa(intSlice)   
    faa(strSlice)
    faa(boolSlice)  
}
相關文章
相關標籤/搜索