肯定有這樣的一種場景,寫一個函數,該函數可以接收任意類型的切片,完成相應的功能。
就好比這種情況
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) }