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()
}
程序运行后,控制台输出如下:
首先,我们定义了一个结构体 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()
}
程序运行后,控制台输出如下:
首先,我们定义了一个结构体 Person,该结构体有两个字段, 接着我们分别为该结构体添加了一个指针类型接收器的 pChangeAge 和普通类型接收器的 changeAge 方法,以及一个打印结果的 print 方法。
在 changeAge 方法里和 pChangeAge 方法里,我们都修改了成员 变量 的值,最后,在 main 函数里面我们分别调用这两个函数,并使用 print 方法打印结构体。
最后,我们发现,指针接收器的方法可以实现对成员变量的修改,但非指针接收器的方法未能实现对成员变量的修改。
Go 语言中结构体方法的接收器可以是一个指针类型,如果是指针类型的接收器,那么在方法中,对结构体的修改都会生效。为结构体添加方法指针接收器语法:
var (s *StructType)funcName(param1 param1Type, ...)(returnVal1 returnType1, ...){
}