golang receiver

mlzhou · · 1595 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

 type F interface {   f() } 
 type S1 struct { myValue int } func (s S1) f() {	fmt.Printf("%d\n", s.myValue) } func (s *S1) fpoint() {	fmt.Printf("%d\n", s.myValue) } 
 type S2 struct {	myValue int } func (s *S2) f() {	fmt.Printf("%d\n", s.myValue) } 
 func main() {	//1.值传递	val := S1{20}	//函数赋值时,初始带入的是第一个隐形参数是val对象本身	//因此这里发生了一次拷贝,当对象本身很大时,不建议使用类型本身作为receiver	m := val.f	m1 := val.fpoint	//数值发生改变	val.myValue = 12	//20	m()	//12	m1()	//接口需要实现f()	var pInter F	pInter = S1{10}	pInter.f()	pInter = &S1{12}	pInter.f()	pInter = &S2{13}	pInter.f()	//pInter = S2{24} } 
 /* 1.要修改实例状态,用*T 2.无须修改状态的小对象或固定值,建议用T 3.大对象建议用*T,以减少复制成本 4.引用类型、字符串、字典、函数等指针包装对象,直接用T 5.若包含Mutex等同步字段,用*T,避免因赋值造成锁操作无效 6.其他无法确定的情况都用*T --------------------------------------------- | method receiver | parameter | | ------------------------------------------| | pointer | pointer | |-------------------------------------------| | value | value | | | pointer (dereferenced) | --------------------------------------------- */

 


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1595 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传