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

go_细节注意

go细节

  • 一、使用指针接受者和不使用指针接受者
    • 1,不使用指针接受者:
    • 2,使用指针接受者
    • 3,区别与优劣势

一、使用指针接受者和不使用指针接受者

1,不使用指针接受者:

func (d dog) move() {fmt.Println("狗会动")
}
func main() {var x Movervar wangcai = dog{} // 旺财是dog类型x = wangcai         // x可以接收dog类型var fugui = &dog{}  // 富贵是*dog类型x = fugui           // x可以接收*dog类型x.move()
}
  • move 方法使用了值接收者 dog,这意味着它可以被任何 dog 类型的实例调用。
  • 在 main 函数中,x 可以接收 dog 类型的值,也可以接收 *dog 类型的指针。然而,在将 wangcai 赋值给 x 时,Go 会自动进行值到指针的转换,因此这里的代码仍然可以编译通过。

2,使用指针接受者

func (d *dog) move() {fmt.Println("狗会动")
}
func main() {var x Movervar wangcai = dog{} // 旺财是dog类型x = wangcai         // x不可以接收dog类型var fugui = &dog{}  // 富贵是*dog类型x = fugui           // x可以接收*dog类型
}
  • move 方法使用了指针接收者 *dog,这意味着它只能被 *dog 类型的指针调用。
  • 在 main 函数中,将 wangcai 赋值给 x 就会导致编译错误,因为 wangcai 是一个 dog 类型的值,而 x 要求接收 *dog 类型的指针。只有当将 fugui 赋值给 x 时,代码才能编译通过。

3,区别与优劣势

  • 调用方式不同:

    值接收者方法可以被实例值调用,也可以被指针调用,而指针接收者方法只能被指针调用。
    值接收者方法在调用时会隐式地将实例值复制一份,而指针接收者方法在调用时操作的是同一个实例,不会产生副本。

  • 修改对象:
    使用指针接收者方法可以修改对象的状态,因为它们直接操作实例,而值接收者方法只能修改副本的状态,不会影响原始实例。

  • 性能和开销:
    值接收者方法会产生一份实例的拷贝,可能导致内存和性能开销。
    指针接收者方法直接操作实例,避免了拷贝,通常更高效。
    选择使用哪种接收者取决于你的需求和设计目标:

  • 如果方法需要修改对象的状态或者需要操作对象的指针,使用指针接收者。
    如果方法不需要修改对象状态,使用值接收者,这样可以避免不必要的指针操作和副本创建。

http://www.lryc.cn/news/126121.html

相关文章:

  • 屏蔽恶意域名的DNS查询
  • SQL-每日一题【1251. 平均售价】
  • Win11中使用pip或者Cython报错 —— error: Microsoft Visual C++ 14.0 is required.
  • Spring学习笔记之Bean的“出生入死”
  • hbase 报错 Master passed us a different hostname to use; was=
  • Aspera替代方案:探索这些安全且可靠的文件传输工具
  • 你真的了解数据结构与算法吗?
  • kafka使用心得(一)
  • Django图书商城系统实战开发-实现商品管理
  • 走出象牙塔:李郓梁的区块链实践之路丨对话MVP
  • 【hive】hive分桶表的学习
  • ReactDOM模块react-dom/client没有默认导出报错解决办法
  • TiDB数据库的安装配置
  • Unity智慧园区夜景制作
  • Linux MQTT智能家居项目(LED界面的布局设置)
  • LeetCode 160.相交链表
  • 【深度学习_TensorFlow】调用keras高层API重写手写数字识别项目
  • 柔性数组(C语言)
  • 判断推理 -- 图形推理 -- 属性规律
  • 【注解使用】使用@Autowired后提示:Field injection is not recommended(Spring团队不推荐使用Field注入)
  • Rust语法: 枚举,泛型,trait
  • hivesql-dayofweek 函数
  • DIP:《Deep Image Prior》经典文献阅读总结与实现
  • LAXCUS如何通过技术创新管理数千台服务器
  • 【Java】BF算法(串模式匹配算法)
  • Vue:使用Promise.all()方法并行执行多个请求
  • 21.0 CSS 介绍
  • 下一代计算:嵌入AI的云/雾/边缘/量子计算
  • Gitlab-第四天-CD到k8s集群的坑
  • 【Java基础】Java对象的生命周期