MST

星途 面试题库

面试题:Go中表达式调用方法集基础问题

请阐述在Go语言中,值类型和指针类型的接收器在表达式调用方法集时有何不同?分别举例说明其调用规则。
43.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 值类型接收器
    • 不同点:值类型接收器在调用方法时,实际传入的是该值的副本。这意味着方法内部对接收器的修改不会影响原始值。
    • 调用规则举例
package main

import "fmt"

type Rectangle struct {
    width  int
    height int
}

func (r Rectangle) Area() int {
    return r.width * r.height
}

func main() {
    rect := Rectangle{width: 5, height: 10}
    area := rect.Area()
    fmt.Printf("Rectangle area: %d\n", area)
}

在上述代码中,Rectangle 结构体使用值类型接收器定义了 Area 方法。rect 实例调用 Area 方法时,是基于 rect 的副本进行计算,不会改变 rect 本身。

  1. 指针类型接收器
    • 不同点:指针类型接收器在调用方法时,传入的是值的指针。这使得方法内部可以直接修改接收器指向的值。
    • 调用规则举例
package main

import "fmt"

type Counter struct {
    value int
}

func (c *Counter) Increment() {
    c.value++
}

func main() {
    counter := Counter{value: 0}
    counterPtr := &counter
    counterPtr.Increment()
    fmt.Printf("Counter value: %d\n", counter.value)
}

在这段代码中,Counter 结构体使用指针类型接收器定义了 Increment 方法。counterPtr 调用 Increment 方法时,因为是指针接收器,所以可以直接修改 countervalue 字段。