MST

星途 面试题库

面试题:Go 值调用方法集特点之中等题

在Go语言中,值类型和指针类型调用方法集时有不同的特点,请阐述使用值类型调用方法集时,对于方法接收者为值类型和指针类型分别有什么规则?
11.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 方法接收者为值类型
    • 值类型变量可以直接调用接收者为值类型的方法。例如:
    type Person struct {
        Name string
    }
    func (p Person) SayHello() {
        println("Hello, my name is", p.Name)
    }
    func main() {
        var p Person
        p.Name = "Tom"
        p.SayHello()
    }
    
    • 指针类型变量也可以调用接收者为值类型的方法,Go语言会自动解引用指针。例如:
    type Person struct {
        Name string
    }
    func (p Person) SayHello() {
        println("Hello, my name is", p.Name)
    }
    func main() {
        p := &Person{Name: "Tom"}
        p.SayHello()
    }
    
  2. 方法接收者为指针类型
    • 指针类型变量可以直接调用接收者为指针类型的方法。例如:
    type Person struct {
        Name string
    }
    func (p *Person) ChangeName(newName string) {
        p.Name = newName
    }
    func main() {
        p := &Person{Name: "Tom"}
        p.ChangeName("Jerry")
    }
    
    • 值类型变量不能直接调用接收者为指针类型的方法,否则会编译报错。如果要调用,需要先将值类型变量转换为指针类型。例如:
    type Person struct {
        Name string
    }
    func (p *Person) ChangeName(newName string) {
        p.Name = newName
    }
    func main() {
        var p Person
        p.Name = "Tom"
        // 下面这行代码会报错,需要改成(&p).ChangeName("Jerry")
        // p.ChangeName("Jerry")
        (&p).ChangeName("Jerry")
    }