Golang Go语言中非指针类型赋值给空接口,编译器会生成一个临时变量再将指针传递给空接口吗?
小弟最近在学 golang ,遇到这样一个问题,如标题所示。 因为空接口的底层数据接口是要接收一个数据指针,那么当我们将一个非指针类型变量赋值给空接口时,golang 是怎么处理的呢? 另外,像类似这样的问题,有什么好的学习资料可以分享一下吗?
Golang Go语言中非指针类型赋值给空接口,编译器会生成一个临时变量再将指针传递给空接口吗?
空接口这个地方越学越困惑了。
如果把一个 int 类型的值赋值给空接口,那空接口里面的数据指针指向哪里?
如果把一个*int 类型的值赋值给空接口,那空接口里面的数据指针指向哪里?
求大佬解释。
更多关于Golang Go语言中非指针类型赋值给空接口,编译器会生成一个临时变量再将指针传递给空接口吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
> 如果把一个 int 类型的值赋值给空接口,那空接口里面的数据指针指向哪里?
把类型 T 的数据 d 赋值给空接口(可以描述为<data,type>的二元组)会在栈或堆上复制一份拷贝 d’,
然后把 d’的地址写到空接口的 data 上.
特别地,如果 T 恰好是一个机器字长(比如 amd64 下的 int64), 那么会把 d 的值直接赋值到 data 处.
参考 https://research.swtch.com/interfaces.
> 特别地,如果 T 恰好是一个机器字长(比如 amd64 下的 int64), 那么会把 d 的值直接赋值到 data 处.
我做了几个小测试,发现不符合这个规律呢?空接口的 data 应该还是存的指针吧?
> 我做了几个小测试,发现不符合这个规律呢?空接口的 data 应该还是存的指针吧?
sorry,调试了下的确只有指针会直接储存, russ cox 的文章有点老了,估计实现被重新评估后丢掉了一部分.
在Golang中,当非指针类型赋值给空接口(interface{}
)时,编译器并不会生成一个临时变量并将指针传递给空接口。这里有一些关键点需要理解:
-
接口实现机制:在Go语言中,接口是一个抽象类型,它规定了对象的行为。当一个值(无论是指针还是非指针)赋给一个空接口时,Go会存储该值的类型和值本身(或者值的指针,对于较大的值类型,Go可能会选择存储指针以避免拷贝开销)。
-
值拷贝与指针存储:对于小值类型(如int、float64等),Go通常会直接存储值的副本在接口内部。而对于较大的值类型(如结构体、切片等),Go为了避免不必要的拷贝,可能会选择存储指向该值的指针。
-
空接口的特殊性:空接口没有定义任何方法,因此它可以持有任何类型的值。这种灵活性是通过在接口内部存储一个类型信息和值(或指向值的指针)来实现的。
综上所述,当非指针类型赋给空接口时,编译器会根据值的类型和大小来决定是直接存储值的副本还是存储指向值的指针。但这个过程并不涉及生成一个额外的临时变量。因此,对于你的问题,答案是否定的:编译器不会生成一个临时变量再将指针传递给空接口。