肯定有這樣的一種場景,寫一個函數,該函數可以接收任意類型的切片,完成相應的功能。 就好比這種情況 還有很多類型的切片,但是我對這些切片的使用,只是for迴圈每一個元素,執行Print操作就可以了。 那就定義一個函數,函數的接收參數就是這個切片就行了,但是切片類型太多了,你要根據不同的切片類型,寫不同 ...
肯定有這樣的一種場景,寫一個函數,該函數可以接收任意類型的切片,完成相應的功能。
就好比這種情況
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)
}