Go语言结构体方法指针接收器

Go语言结构体方法指针接收器教程

Go 语言结构体 方法的接收器如果是 指针 类型,那么我们可以使用指针 变量 来调用,也可以是用非指针变量来调用。

接收器如果是非指针类型,那么调用方法时,我们同样也可以使用指针类型和非指针类型来调用。

如果我们已经定义了一个指针类型(非指针类型)接收器的方法,那么不可以再次定义一个重名的非指针类型(指针类型)接收器。

指针接收器与非指针接收器区别

Golang 中指针接收器与非指针接收器的唯一区别就是指针接收器可以对成员变量进行修改,而非指针接收器不可以对指针变量进行修改。

案例

指针接收器

定义一个结构体,并给该结构体方法添加指针接收器

package main import ( "fmt" ) type Person struct { Name string Age int } //定义一个结构体,并给该结构体方法添加指针接收器 func (p *Person)print(){ fmt.Println("*Person Name =", p.Name, "Age =", p.Age) } func main() { fmt.Println("嗨客网(www.haicoder.net)") var pPerson = &Person{ Name:"HaiCoder", Age:10, } var person = *pPerson pPerson.print() person.print() }

程序运行后,控制台输出如下:

28_golang接收器.png

首先,我们定义了一个结构体 Person,该结构体有两个字段,一个 string 类型的 Name,一个 int 类型的 Age, 接着我们为该结构体添加了一个 print 方法。

print 方法的接收器,是一个指针类型的接收器,但是我们在 main 函数调用的时候,既可以使用结构体指针来调用也可以使用普通的结构体 变量 来调用。

非指针接收器

定义一个结构体,并给该结构体方法添加非指针接收器

package main import ( "fmt" ) type Person struct { Name string Age int } //定义一个结构体,并给该结构体方法添加非指针接收器 func (p Person)print(){ fmt.Println("Person Name =", p.Name, "Age =", p.Age) } func main() { fmt.Println("嗨客网(www.haicoder.net)") var pPerson = &Person{ Name:"HaiCoder", Age:10, } var person = *pPerson pPerson.print() person.print() }

程序运行后,控制台输出如下:

29_golang接收器.png

我们为结构体 Person 添加了一个非指针类型接收器的函数 print,在 main 函数调用的时候,我们既可以使用指针变量来调用,也可以使用非指针变量来调用。

指针接收器和非指针接收器不可以重名

指针接收器和非指针接收器不可以重名

package main import ( "fmt" ) type Person struct { Name string Age int } //指针接收器和非指针接收器不可以重名 func (p Person)print(){ fmt.Println("Person Name =", p.Name, "Age =", p.Age) } func (p *Person)print(){ fmt.Println("Person Name =", p.Name, "Age =", p.Age) } func main() { fmt.Println("嗨客网(www.haicoder.net)") var pPerson = &Person{ Name:"HaiCoder", Age:10, } var person = *pPerson pPerson.print() person.print() }

程序运行后,控制台输出如下:

30_golang接收器.png

我们为结构体 Person 添加了一个重名的指针类型的接收器和非指针类型接收器的函数 print,结果程序运行报错,因此,指针类型的接收器和非指针类型的接收器不可以重名。

Go语言结构体方法指针接收器总结

Go 语言中结构体方法的接收器如果是指针类型,那么我们可以使用指针变量来调用,也可以是用非指针变量来调用。

接收器如果是非指针类型,那么调用方法时,我们同样也可以使用指针类型和非指针类型来调用。