目 录CONTENT

文章目录
Go

Golang中为什么[]T 不能直接转换[]interface{}

Hello!你好!我是村望~!
2023-02-16 / 0 评论 / 0 点赞 / 190 阅读 / 403 字
温馨提示:
我不想探寻任何东西的意义,我只享受当下思考的快乐~

Golang中为什么[]T 不能直接转换[]interface{}

情景再现

今天写了一个函数,传入的参数是 []interface{} 空接口的切片!

func BatchInsertAccounts(accounts []interface{}) error

调用的时候!传入一个 Account 指针的切片类型! users := []*Account{&u1, &u2, &u3}
然后编译器就提示报错了
image-1676532180118

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{} 中,Tinterface{}在内存中的表示方式不同,所以不能进行琐碎的转换。

手动转换

那么我们在使用的时候,就需要手动去转换一下类型 为 []interface{}

- accounts := []*Account{&u1, &u2, &u3}
+ accounts := []interface{}{&u1, &u2, &u3}
0

评论区