[Golang] 用interface{}实现泛型出现的问题
生活随笔
收集整理的這篇文章主要介紹了
[Golang] 用interface{}实现泛型出现的问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
說明
在做一些實(shí)現(xiàn)的時(shí)候,碰到了一個(gè)棘手的問題,問題是這樣的,向一個(gè)函數(shù)里傳入slice和begin,end,返回slice[begin:end]。很明顯這是一個(gè)實(shí)現(xiàn)泛型的問題,但是在做具體實(shí)現(xiàn)的時(shí)候出現(xiàn)問題。
問題
根據(jù)問題,很容易寫下如下代碼:
func returnSlice([]interface{}, begin, end)[]interface{}{ //...具體實(shí)現(xiàn) }slice := returnSlice([]int{1,2,3,4},1,2) // 報(bào)錯(cuò):類型不匹配顯然上述代碼會(huì)報(bào)類型不匹配的錯(cuò)誤,究其原因,是編譯器把[]int{1,2,3,4}作為interface{}看待了,而傳入的參數(shù)類型是[]interface{},所以類型不匹配。
解決方案
需要自己構(gòu)造一個(gè)將interface{}轉(zhuǎn)化為[]interface{}的函數(shù):
//將傳入slice的每個(gè)元素拿出來interface()化 func ToSlice(arr interface{}) []interface{} {v := reflect.ValueOf(arr)if v.Kind() != reflect.Slice {panic("toslice arr not slice")}l := v.Len()ret := make([]interface{}, l)for i := 0; i < l; i++ {ret[i] = v.Index(i).Interface()}return ret }再使用的時(shí)候,就可以slice := returnSlice(ToSlice([]int{1,2,3,4}),1,2)
總結(jié)
以上是生活随笔為你收集整理的[Golang] 用interface{}实现泛型出现的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: framework7中a标签没反应
- 下一篇: [Beego] [bootstrap-p