教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang不会自动把slice转换成interface{}类型的slice

Golang不会自动把slice转换成interface{}类型的slice

发布时间:2023-03-09   编辑:jiaochengji.com
教程集为您提供Golang不会自动把slice转换成interface{}类型的slice等资源,欢迎您收藏本站,我们将为您提供最新的Golang不会自动把slice转换成interface{}类型的slice资源

目录

  • 例子
  • 原因
  • 如何去实现

例子

我们时常会写一些interface,例如:

type A interface{
    Print()
}

type B struct {
}

func (b *B) Print() {
    fmt.Println("Here is *B")
}

赋值的时候:

var a A
a = &B{}

诶,这样看视乎没什么问题,但是我们没有办法避免使用数组,然后顺手就写了这样的代码

var aa []A
aa = make([]*B, 10)

好的,现在翻车了,会得到一个这样的报错:

cannot use make([]*B, 10) (type []*B) as type []A in assignment

原因

  1. []A 不是一个interface,它只是一个slice,并且刚刚好元素类型是A。
  2. []A 有自己特殊的内存分布,每一个interface{}有两个字节,一个是存储他是什么类型,另一个存储数据或者指针来指向他。因此,一个[]A是一块N*2的数据,但是[]*B是一块N*(sizeof(*B))的数据。

如何去实现

bb := []*B{&B{}, &B{}}
var aa []AA = make([]AA, len(bb))
for i, d := range bb {
    aa[i] = d
}

转载于:https://www.cnblogs.com/daryl-blog/p/11003061.html

到此这篇关于“Golang不会自动把slice转换成interface{}类型的slice”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang 初始化并赋值_Golang | 既是接口又是类型,interface是什么神仙用法?
Go基础系列:空接口
真的理解go interface了吗?
Golang slice 切片原理
golang读取接口数据interface{}
理解 Go 编程中的 slice
2020-10-18Go语言接口
golang中的nil
Golang语言slice实现原理及使用方法
golang 接口_Golang之接口

上一篇:协程与异步IO 下一篇:浅谈goroutine
[关闭]
~ ~