確定有這樣的一種場景,寫一個函數,該函數能夠接收任意類型的切片,完成相應的功能。函數
就比如這種狀況.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
下面是解決方法:博客
直接貼代碼,我是參考別人的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) }