MST

星途 面试题库

面试题:Go语言中方法定义时接收者类型为指针和值类型有何区别

在Go语言中,当我们定义方法时,可以选择指针类型或值类型作为接收者。请阐述这两种选择在内存、方法修改能力以及使用场景上有什么不同。
44.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

内存方面

  • 值类型接收者:每次调用方法时,会复制该值类型的副本。如果值类型较大(例如包含大量数据的结构体),复制操作会带来额外的内存开销。
  • 指针类型接收者:调用方法时传递的是指针,无论数据结构多大,传递的只是一个指针的大小(在64位系统上通常为8字节),不会复制整个数据结构,因此在内存使用上更高效,尤其是对于大的结构体。

方法修改能力方面

  • 值类型接收者:方法内部对接收者的修改只会影响副本,不会改变原始值。如果需要修改原始值,需要将修改后的值返回并重新赋值。
  • 指针类型接收者:方法内部对接收者的修改会直接作用于原始数据,因为操作的是指针指向的内存地址。

使用场景方面

  • 值类型接收者
    • 当结构体较小且不需要在方法中修改结构体状态时,使用值类型接收者更简单直观,例如简单的数学计算结构体。
    • 当希望方法内部操作不影响原始数据,而是返回新的结果时,适合使用值类型接收者。
  • 指针类型接收者
    • 当结构体较大,为避免复制带来的性能开销,应使用指针类型接收者,例如包含大量字段或大型数组的结构体。
    • 当方法需要修改结构体的状态,例如对结构体内部字段进行增删改等操作时,必须使用指针类型接收者。