📌  相关文章
📜  golang 接口指针接收器 - Go 编程语言 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 14:41:34.889000             🧑  作者: Mango

Golang 接口指针接收器

在Go中,可以通过接口类型来实现多态性,即让一个变量或函数可以接受多种类型的值。而在接口定义中,可以使用值接收器(value receiver)或指针接收器(pointer receiver)来定义方法。本文将介绍Golang接口中指针接收器的使用。

接口定义

首先,让我们定义一个接口MyInterface,其中包含了一个使用指针接收器的方法Print()

type MyInterface interface {
    Print()
}
实现接口

接下来我们定义一个结构体MyStruct,并为其实现MyInterface接口中的方法Print()使用指针接收器:

type MyStruct struct {
    name string
}

func (ms *MyStruct) Print() {
    fmt.Println(ms.name)
}

要注意的是,由于MyStruct实现了MyInterface接口中定义的方法Print()使用了指针接收器,因此它只能被定义为指针类型。以下示例代码说明了这一点:

func main() {
    var m MyInterface
    s := MyStruct{"hello"}
    m = &s
    m.Print()  // 输出 "hello"
}
接口变量与nil

由于Golang中的接口变量可以存储nil值,因此MyInterface类型的变量可以赋值nil值。在调用其中定义的方法时,由于使用了指针接收器,在实现了该接口的类型的变量为nil时,调用该方法会抛出异常。以下示例代码说明了这一点:

func main() {
    var m MyInterface
    var s *MyStruct
    m = s
    m.Print()  // 报错:runtime error: invalid memory address or nil pointer dereference
}

为了避免出现这类问题,我们可以通过其他方法避免将nil值赋值给指针类型的变量,或者在方法执行前加上nil判断。