Golang 为什么不能直接将任意类型数组赋值给 []interface{}完成泛型操作
生活随笔
收集整理的這篇文章主要介紹了
Golang 为什么不能直接将任意类型数组赋值给 []interface{}完成泛型操作
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
想用 []interface{} 類(lèi)型來(lái)接受一個(gè)任意類(lèi)型的數(shù)組,從而進(jìn)行泛型操作時(shí),發(fā)現(xiàn)直接賦值會(huì)發(fā)生錯(cuò)誤,導(dǎo)致 panic
var dataSlice []int = foo() var interfaceSlice []interface{} = dataSlicecannot use dataSlice (type []int) as type []interface { } in assignment先說(shuō)結(jié)論:?interface{} 可以接收任何類(lèi)型,但是[]interface{} 并不可以接收任何類(lèi)型的切片
[]interface{} 并不是 interface{},它是一個(gè)元素類(lèi)型為 interface{} 的切片。
主要是因?yàn)?[]interface{} 有特殊的內(nèi)存布局。先看一下 []interface{} 的內(nèi)存布局:
可是普通類(lèi)型的切片內(nèi)存布局是:
所以,根本原因就是兩個(gè)東西的內(nèi)存布局不同,即底層數(shù)據(jù)結(jié)構(gòu)不同,所以無(wú)法直接賦值。
如果真的要 用[]interface{} 類(lèi)型來(lái)接受一個(gè)任意類(lèi)型的數(shù)組,可以用循環(huán)賦值的方式
var dataSlice []int = foo() var interfaceSlice []interface{} = make([]interface{}, len(dataSlice)) for i, d := range dataSlice {interfaceSlice[i] = d }總結(jié)
以上是生活随笔為你收集整理的Golang 为什么不能直接将任意类型数组赋值给 []interface{}完成泛型操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 做程序员10年了,复制粘贴是我最牛的技能
- 下一篇: error: goland --buil