结构体数组与接口数组转换
如果想把[]struct转为[]interface,我们发现直接赋值会报错。
理论上interface可以转换任何数据,为什么结构体数组不可以呢?这是因为interface的设计导致的,如果能理解interface的底层实现,就能很清楚知道如何转换了。
如图所示,与C++的虚函数类似,interface保存了两部分内容,一部分是数据类型,另一部分是数据,所以可以被转化为任何数据。[]struct是被当作一个整体看待的,[]struct与struct,或者与int都没区别,表示一种数据类型。[]struct可以转换为interface,但是[]interface表示有一组interface,一个[]struct,当然不可能转化为多个interface,也就不能转化为[]interface。
实际上我们的意思是把[]struct中的每个元素作为独立个体,再对应[]iterface中的每个interface。既然理解到这一层,就可以很好的实现转换了:
// 根据[]struct x的元素个数,创建对应的[]interface y
y := make([]interface{}, len(x))
// 遍历[]struct x中的每个元素,转换为[]interface y中的每个元素
for i, v := range x {
y[i] = v
}
https://go.dev/doc/faq#convert_slice_of_interface
https://research.swtch.com/interfaces
https://stackoverflow.com/questions/44319906/why-golang-struct-array-cannot-be-assigned-to-an-interface-array