MST

星途 面试题库

面试题:Go语言中方法调用的基本模式及值接收者和指针接收者的区别

请阐述Go语言中方法调用的基本模式有哪些。同时,详细说明使用值接收者和指针接收者进行方法调用时,在内存和行为表现上有什么不同,并举例说明。
27.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Go语言方法调用基本模式

  1. 值接收者调用:通过结构体值来调用方法,此时方法内对接收者的修改不会影响原始结构体。
  2. 指针接收者调用:通过结构体指针来调用方法,方法内对接收者的修改会影响原始结构体。

值接收者和指针接收者在内存和行为表现上的不同

  • 内存表现
    • 值接收者:在方法调用时,会复制一份结构体值,方法内操作的是这个副本,占用额外内存。
    • 指针接收者:方法调用时传递的是结构体的内存地址,不额外复制结构体,节省内存。
  • 行为表现
    • 值接收者:对接收者的修改不会影响原始结构体。适用于只读操作或需要操作副本的场景。
    • 指针接收者:对接收者的修改会影响原始结构体。适用于需要修改结构体状态的场景。

示例

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 本身。