当前位置: 首页 > news >正文

在线生成固定悬浮导航的工具网站如何做测评视频网站

在线生成固定悬浮导航的工具网站,如何做测评视频网站,个人网站做哪些流程,网站如何看是哪家公司做的go 指针接收者和值接收者的区别 指针接收者和值接收者的区别主要有两点: Go 中函数传参是传值,因此指针接收者传递的是接收者的指针拷贝,值接收者传递的是接收者的拷贝---在方法中指针接收者的变量会被修改,而值接收者的成员变量…

go 指针接收者和值接收者的区别

指针接收者和值接收者的区别主要有两点:

  1. Go 中函数传参是传值,因此指针接收者传递的是接收者的指针拷贝,值接收者传递的是接收者的拷贝---在方法中指针接收者的变量会被修改,而值接收者的成员变量修改是无效的(毕竟传入的是拷贝,修改的自然也是拷贝的成员变量)。
  2. 在接口实现上,如果值接收者实现了某个方法,相当于值接收者和指针接收者都实现了这个方法。反之则不行,即指针接收者实现了某个方法,不能看成值接收者实现这个方法。

注意第2点只影响接口实现,如果不涉及接口的话是不受到这条规则约束的。

一个助记的但是不太正确的观点:接收者是指针类型的方法,很可能在方法中会对接收者的属性进行更改操作,从而影响接收者;而对于接收者是值类型的方法,在方法中不会对接收者本身产生影响。

理解角度:指针接收者可以选择修改自己的值和不修改,值接收者修改自己的值是无效的(因为是拷贝)。所以可以看成指针接收者的能力>值接收者的能力,自然:指针接收者实现某个方法可以看成值接收者实现某个方法,反之则不行。

package mainimport "fmt"type coder interface {code()debug()
}type Gopher struct {language string
}func (p Gopher) code() {fmt.Printf("I am coding %s language\n", p.language)
}func (p *Gopher) debug() {fmt.Printf("I am debuging %s language\n", p.language)
}func main() {var c coder = &Gopher{"Go"} //运行正常//上一行换成: var c coder = Gopher{"Go"} // 则报错 Gopher does not implement coder (debug method has pointer receiver)c.code()c.debug()
}

注意📢:对于👆🏻上面的第 2 点补充:虽然隐式实现的方法不一样,但是如果不涉及接口,单纯在调用的时候,无论是指针接收者还是值接收者实现了某个方法,指针接收者和值接收者都可以调用。本质上是 go 的语法糖。

最佳实践:

如果类型具备“原始的本质”,即其成员都是由 Go 语言里内置的原始类型,如字符串,整型值等,那就定义值接收者类型的方法。

内置的引用类型,如 slice,map,interface,channel,这些类型比较特殊,声明他们的时候,实际上是创建了一个 header​, 对于他们也是直接定义值接收者类型的方法。这样,调用函数时,是直接 copy 了这些类型的 header​,而 header​ 本身就是为复制设计的。

如果类型具备非原始的本质,不能被安全地复制,这种类型总是应该被共享,那就定义指针接收者的方法。

虽然上面是这么说,但是个人感觉在实际使用中,基本可以无脑使用指针接收者。主要原因在于:1.指针接收者没有值拷贝带来的巨大开销。2.如果就想在函数中修改值就必须使用指针接收者。3.值接收者唯一的优势就是为了防止意外的修改,为了防止这一点可以通过创建一个函数或者方法来手动 copy,而这并不会带来多大的开销。

易错点辨析

  • 是否改变结构体的值看的是方法是指针接收者还是值接收者,而不是看调用方是指针还是值。原因在于golang编译器在背后会完成一些工作,比如:解引用,隐式使用引用。代码范例如下:
package mainimport "fmt"type Node struct {val int
}func (receiver Node) changeVal1() {receiver.val++
}func (receiver *Node) changeVal2() {receiver.val++
}
func main() {someOne := Node{}someOne.changeVal1()fmt.Printf("%d\n", someOne.val) //0 ,说明没有改值,因为方法接收者是值接收者someOnePtr := &Node{}someOnePtr.changeVal1()fmt.Printf("%d\n", someOnePtr.val) //0 ,说明没有改值,因为方法接收者是值接收者,与调用方是否指针无关someTwo := Node{}someTwo.changeVal2()fmt.Printf("%d\n", someTwo.val) //1 ,说明成功改值,因为方法接收者是指针接收者,与调用方是否指针无关someTwoPtr := &Node{}someTwoPtr.changeVal2()fmt.Printf("%d\n", someTwoPtr.val) //1 ,说明成功改值,因为方法接收者是指针接收者,与调用方是否指针无关}

参考:https://golang.design/go-questions/interface/receiver/

http://www.dtcms.com/a/452166.html

相关文章:

  • 网站开发的常用软件统计站老站长推荐app视频
  • 自己怎么给网站做优化排名新手搭建WordPress
  • 网站建设哪家好 需要多少钱网页设计实验报告心得和总结500字
  • 廊坊seo网站排名网站建设账户搭建
  • 网站排名优化提升快速徐州睢宁建设网站
  • 我贷款网站如何做easyui网站开发实战 pdf
  • 懒人之家网站模板建湖人才网临时工招聘
  • 国外网站建设模板平台推广方式
  • 网站建设加推广wordpress 首页统计
  • 上海网站建设品做ppt比较好的网站有哪些
  • 四川网站建设设计公司哪家好wordpress php占内存
  • 百度联盟广告怎么关闭网站优化升级
  • 写网站建设的软文网站怎么建设好看
  • 上海专业网站建站济南网站设计哪家好
  • 企业网站的页面特点浦东网站开发
  • 做网站公司赚不赚钱响应式网站制作流程图
  • 重庆智能网站建设推荐跨境电商营销策划方案
  • 建设手机网站包括哪些费用吗建设企业网站的作用
  • 微网官方网站泉州哪里建设网站
  • 网页设计与网站建设pptwordpress注册表文件
  • 网站代码 商品添加分类注册网站的软件
  • 京东网站的建设目的在国内可以做国外的网站吗
  • 做视频网站服务器怎么选择同性男做性视频网站
  • 手机网站 qq代码国际外贸交易平台有哪些
  • 云南省城市建设培训中心网站网站空间关闭了怎么办
  • 武鸣网站建设wordpress付费下载模板
  • 山东建设发展研究院网站网站外部优化
  • ps建设此网站的必要与可行性重庆短视频seo优化推荐
  • 做网站需不需要营业执照手机做任务的网站有哪些内容
  • 网站的投票系统怎么做动漫网站建设方案策划书