面试题答案
一键面试- 值类型接收器
- 不同点:值类型接收器在调用方法时,实际传入的是该值的副本。这意味着方法内部对接收器的修改不会影响原始值。
- 调用规则举例:
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
本身。
- 指针类型接收器
- 不同点:指针类型接收器在调用方法时,传入的是值的指针。这使得方法内部可以直接修改接收器指向的值。
- 调用规则举例:
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
方法时,因为是指针接收器,所以可以直接修改 counter
的 value
字段。