Golang 傳遞任意類型的切片


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

就好比這種情況

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就可以。那么有沒有一種類型,可以接收所有類型的參數呢?

interface{}: 空接口這個類型,他可以接收任意類型的數據

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了吧,

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。所以這樣是不行的。

下面是解決方法:

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

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

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

// 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)  
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM