Golang中为什么[]T 不能直接转换[]interface{}
情景再现
今天写了一个函数,传入的参数是 []interface{}
空接口的切片!
func BatchInsertAccounts(accounts []interface{}) error
调用的时候!传入一个 Account 指针的切片类型! users := []*Account{&u1, &u2, &u3}
然后编译器就提示报错了
cannot use users (variable of type []*Account) as []interface{} value in argumen to BatchInsertAccountscompilerIncompatibleAssign
我就在想,咦~ interface{} 空接口不就是代表任何类型都可以吗? 为什么
[]*Account
不能直接转换为[]interface{}
呢?
golang中的转换原则
推荐阅读 golang-convert-type-to-interface
In Go, there is a general rule that syntax should not hide complex/costly operations. Converting a string to an interface{} is done in O(1) time. Converting a []string to an interface{} is also done in O(1) time since a slice is still one value. However, converting a []string to an []interface{} is O(n) time because each element of the slice must be converted to an interface{}.
翻译:
在go中,有一个共性原则:语法不应该存在复杂(消耗昂贵)的操作。
- 把
string
转换成interface{}
的时间复杂度是O(1)
。 - 转换[]string转换成
nterface{}
,也是O(1)
。 - 但转换
[]string
成[]interface{}
需要的时间复杂度是O(n)
,因为slice
中的每个元素都需要转换成interface{}
深层原因
需要注意的是,[]T
和 []interface{}
中,T
和interface{}
在内存中的表示方式不同,所以不能进行琐碎的转换。
手动转换
那么我们在使用的时候,就需要手动去转换一下类型 为 []interface{}
- accounts := []*Account{&u1, &u2, &u3}
+ accounts := []interface{}{&u1, &u2, &u3}
评论区