golang中接口的值为什么是不可寻址的,以及golang中哪些是不可取址的

参考链接:

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) //可寻址
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值