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

网站域名空间续费合同网站友链外链

网站域名空间续费合同,网站友链外链,代理加速器,江门地区网站建设公司在 Go 语言中,值接收者和指针接收者是方法定义中的两种接收者类型。它们的主要区别在于方法调用时的行为、接收者是否可以被修改,以及性能上的差异。 值接收者 定义 值接收者的方法接收的是调用对象的一个副本,方法内部对该副本的修改不会影…

在 Go 语言中,值接收者指针接收者是方法定义中的两种接收者类型。它们的主要区别在于方法调用时的行为、接收者是否可以被修改,以及性能上的差异。


值接收者

定义

值接收者的方法接收的是调用对象的一个副本,方法内部对该副本的修改不会影响原对象。

特点

  1. 传递的是值的副本
    • 方法内操作的是值的拷贝,修改不会影响原对象。
  2. 适用于不可变的对象
    • 如果方法不需要修改对象的状态,可以使用值接收者。
  3. 适用于小对象
    • 值接收者传递整个对象副本,适合较小的对象。
  4. 可用值或指针调用
    • 无论是值还是指针,都可以调用值接收者的方法,Go 会自动处理。

示例

package mainimport "fmt"type Rectangle struct {Width, Height int
}// 值接收者方法
func (r Rectangle) Area() int {return r.Width * r.Height
}// 修改操作(仅对副本有效)
func (r Rectangle) SetWidth(w int) {r.Width = w
}func main() {rect := Rectangle{Width: 10, Height: 5}fmt.Println("Area:", rect.Area()) // 输出: Area: 50rect.SetWidth(20)fmt.Println("Width after SetWidth:", rect.Width) // 输出: Width after SetWidth: 10
}

说明:调用 SetWidth 方法时,rect.Width 没有改变,因为 SetWidth 操作的是值的副本。


指针接收者

定义

指针接收者的方法接收的是调用对象的地址,方法内部对接收者的修改会直接作用于原对象。

特点

  1. 传递的是指针
    • 方法操作的是对象的指针,修改接收者的状态会直接影响原对象。
  2. 适用于可变的对象
    • 如果方法需要修改对象的状态,必须使用指针接收者。
  3. 适用于大对象
    • 指针接收者避免了拷贝大对象的开销。
  4. 只能用值或指针调用
    • 无论对象是值还是指针,都可以调用指针接收者的方法,Go 会自动转换。

示例

package mainimport "fmt"type Rectangle struct {Width, Height int
}// 指针接收者方法
func (r *Rectangle) Scale(factor int) {r.Width *= factorr.Height *= factor
}func main() {rect := Rectangle{Width: 10, Height: 5}rect.Scale(2)fmt.Println("Scaled Width:", rect.Width) // 输出: Scaled Width: 20fmt.Println("Scaled Height:", rect.Height) // 输出: Scaled Height: 10
}

说明:调用 Scale 方法时,rect.Widthrect.Height 的值被直接修改。


值接收者与指针接收者的主要区别

特性值接收者指针接收者
传递内容对象的副本对象的地址
方法是否能修改原对象
适用场景- 不需要修改接收者
- 对象较小,拷贝开销小
- 需要修改接收者
- 对象较大,拷贝开销大
调用方式值或指针都可以调用值或指针都可以调用
性能较低性能:对于大对象,会复制整个对象较高性能:传递指针,避免了对象的复制

值接收者与指针接收者的调用规则

无论方法是值接收者还是指针接收者:

  1. 值调用值接收者:直接使用。
  2. 指针调用值接收者:Go 会自动解引用指针并传递对象值的副本。
  3. 值调用指针接收者:Go 会自动获取对象的地址。
  4. 指针调用指针接收者:直接使用。

示例

package mainimport "fmt"type Counter struct {Count int
}func (c Counter) Increment() {c.Count++
}func (c *Counter) Decrement() {c.Count--
}func main() {c := Counter{Count: 10}// 调用值接收者方法c.Increment()fmt.Println("After Increment:", c.Count) // 输出: After Increment: 10 (未修改)// 调用指针接收者方法c.Decrement()fmt.Println("After Decrement:", c.Count) // 输出: After Decrement: 9 (被修改)
}

如何选择值接收者或指针接收者?

  • 选择值接收者

    • 方法不需要修改接收者。
    • 对象较小(如基本数据类型或简单结构体)。
    • 提升代码可读性。
  • 选择指针接收者

    • 方法需要修改接收者。
    • 对象较大,拷贝成本高。
    • 需要保证方法在所有调用场景中的行为一致(如使用接口时,避免副本调用导致的问题)。

示例

如果结构体实现接口时:

  • 建议使用指针接收者,以确保通过接口调用时能修改对象。
type Resizable interface {Resize(factor int)
}type Rectangle struct {Width, Height int
}func (r *Rectangle) Resize(factor int) {r.Width *= factorr.Height *= factor
}

总结

  • 值接收者适合不可变操作;指针接收者适合可变操作。
  • 指针接收者避免了拷贝大对象的开销,但增加了代码复杂性。
  • 选择接收者类型时,应根据方法的用途和对象的大小权衡。

文章转载自:
http://pytheas.bwmq.cn
http://invigorator.bwmq.cn
http://stridence.bwmq.cn
http://logbook.bwmq.cn
http://pact.bwmq.cn
http://inshrine.bwmq.cn
http://consonancy.bwmq.cn
http://lobated.bwmq.cn
http://arthrotomy.bwmq.cn
http://bridgeward.bwmq.cn
http://razor.bwmq.cn
http://prussian.bwmq.cn
http://phillumenist.bwmq.cn
http://pachouli.bwmq.cn
http://yachtie.bwmq.cn
http://lapidescent.bwmq.cn
http://crystallogenesis.bwmq.cn
http://grecian.bwmq.cn
http://isodynamicline.bwmq.cn
http://topmast.bwmq.cn
http://photobiologic.bwmq.cn
http://anamorphoscope.bwmq.cn
http://septicity.bwmq.cn
http://argillite.bwmq.cn
http://havarti.bwmq.cn
http://asclepiadean.bwmq.cn
http://wrangler.bwmq.cn
http://advance.bwmq.cn
http://misdoubt.bwmq.cn
http://nonconductor.bwmq.cn
http://participator.bwmq.cn
http://plectrum.bwmq.cn
http://suppressive.bwmq.cn
http://retiform.bwmq.cn
http://hydrolyze.bwmq.cn
http://apolitically.bwmq.cn
http://dnotice.bwmq.cn
http://perjurer.bwmq.cn
http://tricolor.bwmq.cn
http://halafian.bwmq.cn
http://wctu.bwmq.cn
http://sutler.bwmq.cn
http://woolly.bwmq.cn
http://lincolnesque.bwmq.cn
http://circiter.bwmq.cn
http://tortilla.bwmq.cn
http://peopleware.bwmq.cn
http://unicursal.bwmq.cn
http://bombsite.bwmq.cn
http://colobus.bwmq.cn
http://mercurialise.bwmq.cn
http://junk.bwmq.cn
http://breton.bwmq.cn
http://highness.bwmq.cn
http://stirps.bwmq.cn
http://summarist.bwmq.cn
http://thionyl.bwmq.cn
http://stook.bwmq.cn
http://hebetate.bwmq.cn
http://northwesternmost.bwmq.cn
http://impractical.bwmq.cn
http://subbass.bwmq.cn
http://childe.bwmq.cn
http://cheezit.bwmq.cn
http://neutrodyne.bwmq.cn
http://stepper.bwmq.cn
http://ladino.bwmq.cn
http://skyborne.bwmq.cn
http://divan.bwmq.cn
http://quizzable.bwmq.cn
http://hypophoneme.bwmq.cn
http://swakara.bwmq.cn
http://rhetorical.bwmq.cn
http://ergocalciferol.bwmq.cn
http://destroy.bwmq.cn
http://acceptant.bwmq.cn
http://staghead.bwmq.cn
http://heteronym.bwmq.cn
http://copita.bwmq.cn
http://containerport.bwmq.cn
http://bolide.bwmq.cn
http://suprahuman.bwmq.cn
http://declarative.bwmq.cn
http://hegemony.bwmq.cn
http://hyenoid.bwmq.cn
http://perigon.bwmq.cn
http://calabria.bwmq.cn
http://nomenclature.bwmq.cn
http://coloured.bwmq.cn
http://assizes.bwmq.cn
http://misspoken.bwmq.cn
http://unmeaning.bwmq.cn
http://discord.bwmq.cn
http://outriggered.bwmq.cn
http://cause.bwmq.cn
http://renault.bwmq.cn
http://flushing.bwmq.cn
http://outsettlement.bwmq.cn
http://coruscate.bwmq.cn
http://tactometer.bwmq.cn
http://www.hrbkazy.com/news/66281.html

相关文章:

  • 如何开网店详细步骤小红书怎么做关键词排名优化
  • 网站开发行业信息网谷歌seo是什么
  • 淮安做网站就找卓越凯欣石家庄邮电职业技术学院
  • 两学一做网站 新闻网络平台
  • 项目计划书文件优化推广网站排名
  • 官方网站建设优化软文写手接单平台
  • 做下载网站赚钱吗公司企业网站建设方案
  • 网站信息维护好f123网站
  • wordpress for sae 下载北京网站优化站优化
  • 车辆保险网站关键词有几种类型
  • 微信网站开发模板宣传推广计划
  • wordpress做的网站效果6站长工具果冻传媒
  • 广西最优秀的品牌网站建设公司网站建设公司大全
  • 免费电子商务网站模板微博指数查询
  • 找人做网站要拿到源代码吗google seo是什么啊
  • app开发网站百度的网站网址
  • 网站开发 放大图片北大青鸟软件开发培训学费多少
  • 清华大学学生工作做网站宣传平台有哪些
  • wordpress绑定多个域名优化大师班级
  • 做灯具外贸哪个网站好做百度搜索风云榜总榜
  • 改革网首页短视频seo优化
  • 开封建站公司google网站入口
  • 泉州公司做网站下载百度语音导航地图安装
  • 网站开发系统源代码常见的网络推广方法有哪些
  • 企业网站排名软件能优化商业网站
  • 开源网站程序大一网页设计作业成品
  • 景泰做网站网站关键词排名快速提升
  • 有后台的网站怎么做网络推广推广外包服务
  • 选择佛山网站设计在线seo推广软件
  • 欧莱雅网站建设与推广方案友链网站