面试题答案
一键面试-
区别
- 值接收者:方法在调用时,接收者会被复制一份。这意味着在方法内部对接收者的修改不会影响到原始对象。
- 指针接收者:方法调用时,接收者传递的是指针,在方法内部对接收者的修改会直接影响到原始对象。
-
使用场景
- 值接收者适用场景:
- 当方法不需要修改接收者状态时,使用值接收者。例如,一些只用于读取接收者属性的方法。这样可以避免不必要的指针操作,提高代码的可读性。
- 当接收者类型是像
int
、string
、struct
等值类型且占用内存不大时,使用值接收者也较为合适,因为复制开销较小。
- 指针接收者适用场景:
- 当方法需要修改接收者状态时,必须使用指针接收者。例如,对结构体内部字段进行修改的方法。
- 当接收者是一个大的结构体,使用指针接收者可以避免在方法调用时进行大量的数据复制,提高性能。
- 值接收者适用场景:
-
举例说明
package main
import "fmt"
// 定义一个结构体
type Person struct {
Name string
Age int
}
// 值接收者方法
func (p Person) GetInfo() string {
return fmt.Sprintf("Name: %s, Age: %d", p.Name, p.Age)
}
// 指针接收者方法
func (p *Person) IncreaseAge() {
p.Age++
}
func main() {
p := Person{Name: "John", Age: 30}
fmt.Println(p.GetInfo())
p.IncreaseAge()
fmt.Println(p.GetInfo())
}
在上述例子中,GetInfo
方法使用值接收者,因为它只是读取 Person
结构体的信息。而 IncreaseAge
方法使用指针接收者,因为它需要修改 Person
结构体的 Age
字段。