参考链接:
1.https://stackoverflow.com/questions/48790663/why-value-stored-in-an-interface-is-not-addressable-in-golang
2.https://blog.csdn.net/xingyu97/article/details/118093922
一、golang中接口的值为什么是不可寻址的
答案在于如果它是可寻址的后续影响。 存储在接口中的非指针值无法寻址以保持类型完整性。假设接口可寻址,例如,指向***A*的指针指向接口中类型*A*的值,当随后将不同类型*B***的值存储在接口中时,该指针将无效。
由于存储在接口中的非指针值不可寻址,因此编译器无法将其地址传递给具有指针接收器的方法。
二、什么是不可寻址的
不可以寻址,指的是不能通过&获得其地址。golang中不能寻址的可以总结为:不可变的,临时结果和不安全的。只要符合其中任何一个条件,它就是不可以寻址的。
此外,这涉及到可寻址的定义,“ 在Go中,可寻址性的一个宽松定义是,你可以获取某个东西的地址,并确保这个地址指向某个有意义的地方。 ”。
golang中哪些值不可寻址:
1.常量的值。
2.基本类型值的字面量。
3.算术操作的结果值。
4.对各种字面量的索引表达式和切片表达式的结果值。不过有一个例外,对切片字面量的索引结果值却是可寻 址的。
5.对字符串变量的索引表达式和切片表达式的结果值
6.对字典变量的索引表达式的结果值。
7.函数字面量和方法字面量,以及对它们的调用表达式的结果值。
8.结构体字面量的字段值,也就是对结构体字面量的选择表达式的结果值。
9.类型转换表达式的结果值。
10.类型断言表达式的结果值。
11.接收表达式的结果值。
三、测试代码&怎么变成可寻址的(部分)
https://blog.csdn.net/xingyu97/article/details/118093922 这篇博客中我觉得写得很全了,我再加一点:
//数组
_=&([3]int{1,2,3}) //可寻址
var arr [3]int
_=&(arr[1]) //可寻址数组元素 可寻址
//_=&([3]int{1,2,3}[1]) //不可寻址数组元素 不可寻址
//切片
//_=&(make([]int,0)) //不可寻址
_=&(make([]int,0)[1]) //切片中元素 可寻址
//结构体
type person struct{
age int
name string
}
_=&((&person{1,"voyager"}).age) //可寻址结构体字段名 可寻址
//_=&(person{1,"voyager"}.age) //不可寻址结构体字段名 不可寻址
//map
//_:=&(make(map[string]string,0)) //不可
//_:=&(make(map[string]string,0)[1]) //不可
var m map[string]string//{"1":"a", "2": "b", "3": "c"}
//_=&(m["a"]) //不可
//通道
//_=&(make(chan int,1)) //不可寻址
1.如果值是切片的元素、可寻址数组的元素、可寻址结构体的字段或解引用的指针结果,则该值是可寻址的。
2.make函数生成的不可取址
//_=&(make([]int,0)) //不可寻址
m:=make([]int,0)
_=&(m) //可寻址 因为m已经是个变量啦 其他同理
so,怎么将接口中的值变成可寻址的呢
var I interface{}
I="voyager"
_=&(I.(string)) //不可寻址
s:=I.(string)
_=&(s) //可寻址