面试题答案
一键面试Go语言方法调用基本模式
- 值接收者调用:通过结构体值来调用方法,此时方法内对接收者的修改不会影响原始结构体。
- 指针接收者调用:通过结构体指针来调用方法,方法内对接收者的修改会影响原始结构体。
值接收者和指针接收者在内存和行为表现上的不同
- 内存表现:
- 值接收者:在方法调用时,会复制一份结构体值,方法内操作的是这个副本,占用额外内存。
- 指针接收者:方法调用时传递的是结构体的内存地址,不额外复制结构体,节省内存。
- 行为表现:
- 值接收者:对接收者的修改不会影响原始结构体。适用于只读操作或需要操作副本的场景。
- 指针接收者:对接收者的修改会影响原始结构体。适用于需要修改结构体状态的场景。
示例
package main
import "fmt"
// 定义一个结构体
type Person struct {
Name string
Age int
}
// 值接收者方法
func (p Person) PrintValue() {
fmt.Printf("Value Receiver - Name: %s, Age: %d\n", p.Name, p.Age)
}
// 指针接收者方法
func (p *Person) IncrementAge() {
p.Age++
}
func main() {
// 创建一个Person实例
person := Person{Name: "Alice", Age: 30}
// 值接收者调用
person.PrintValue()
// 指针接收者调用
(&person).IncrementAge()
fmt.Printf("After increment - Name: %s, Age: %d\n", person.Name, person.Age)
}
在上述代码中,PrintValue
方法使用值接收者,IncrementAge
方法使用指针接收者。PrintValue
方法操作的是 person
的副本,而 IncrementAge
方法直接修改了 person
本身。