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

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

Go 语言结构体 方法的接收器可以是一个 指针 类型,如果是指针类型的接收器,那么在方法中,对结构体的修改都会生效。

为结构体添加方法指针接收器

语法

var (s *StructType)funcName(param1 param1Type, ...)(returnVal1 returnType1, ...){ }

说明

为结构体 StructType 添加一个 函数 funcName,该函数的 参数 为 param1,返回值 为 returnVal1,参数和返回值可以有 0 个或者任意多个。

这里的 s,是一个指针接收器,因此,如果我们通过 s 对结构体成员变量的修改,在函数调用之后,都会生效。

案例

为结构体方法添加指针接收器

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

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() }

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

26_golang结构体方法指针接收器.png

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

该 print 方法,没有任何的参数和返回值, 我们在该函数里直接打印结构体的两个字段的值,最后在 main 函数里面调用结构体函数。

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

指针接收器修改成员变量

使用指针接收器的方法,可以通过指针修改成员变量的值

package main import ( "fmt" ) type Person struct { Name string Age int } //使用指针接收器的方法,可以通过指针修改成员变量的值 func (p *Person)pChangeAge(){ if p.Age < 18{ p.Age = 18 } } func (p Person)changeAge(){ if p.Age < 18{ p.Age = 18 } } 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, } pPerson.changeAge() pPerson.print() pPerson.pChangeAge() pPerson.print() }

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

27_golang结构体方法指针接收器.png

首先,我们定义了一个结构体 Person,该结构体有两个字段, 接着我们分别为该结构体添加了一个指针类型接收器的 pChangeAge 和普通类型接收器的 changeAge 方法,以及一个打印结果的 print 方法。

在 changeAge 方法里和 pChangeAge 方法里,我们都修改了成员 变量 的值,最后,在 main 函数里面我们分别调用这两个函数,并使用 print 方法打印结构体。

最后,我们发现,指针接收器的方法可以实现对成员变量的修改,但非指针接收器的方法未能实现对成员变量的修改。

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

Go 语言中结构体方法的接收器可以是一个指针类型,如果是指针类型的接收器,那么在方法中,对结构体的修改都会生效。为结构体添加方法指针接收器语法:

var (s *StructType)funcName(param1 param1Type, ...)(returnVal1 returnType1, ...){ }