ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

go 不可寻址的理解

2022-03-02 16:02:14  阅读:161  来源: 互联网

标签:string setName getName 理解 Person 寻址 go Male


The concrete value stored in an interface is not addressable, in the same way that a map element is not addressable.
意思具体值赋值给 interface 类型后与 map 中的元素一样是不可寻址的。

map 由于可能触发扩容,元素不可寻址;

package main

const NewName = "run.wu"

type Person interface {
	getName() string
	setName(name string)
}

type Male struct {
	Name string
}

func (m Male) getName() string {
	return m.Name
}

func (m *Male) setName(name string) {
	m.Name = name
}

func main() {
	var p1 Person = Male{} // error
	p1.getName()
	p1.setName(NewName)

	var p2 Person = &Male{}
	p2.getName()
	p2.setName(NewName)
}

初始化 Male 的值对象赋值给 Person 接口,记作 p1,直接报错:

cannot use Male literal (type Male) as type Person in assignment:
Male does not implement Person (setName method has pointer receiver)
错误内容是,Male 类型的变量不能赋值给 Person,因为 Male 类型没有实现 Person 接口(setName 是指针接收者方法)。

那为什么之前的例子中,编译器可以自动将值类型(非接口类型)取地址做隐示转换,而这里就不可以了?原因就是开头那就话:

The concrete value stored in an interface is not addressable.

值类型赋值给接口,是不可寻址的,既然不可寻址,编译器也就没办法自动取其地址传给指针接收的方法了。

标签:string,setName,getName,理解,Person,寻址,go,Male
来源: https://www.cnblogs.com/fanzou/p/15955576.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有