Go语言结构体方法详解(小白必读)
结构体方法的定义过程与传统的类方法有所不同,类方法定义在类中,结构体方法定义在结构体之外,Go 语言将结构体和结构体方法进行解耦操作,使代码设计变得更加灵活。
在 Go 语言中,函数与方法代表不同的概念,函数是独立的,方法是指结构体方法,它依赖于结构体,但两者皆以关键字 func 定义,只是定义方式略有不同。
结构体方法的定义语法如下:
结构体方法与函数的区别在于结构体方法必须在关键字和方法名称之间使用小括号声明结构体变量(称为值接收者)或结构体的指针变量(称为指针接收者),如 func (p person) get_name 和 func (p *person) get_name,并且结构体方法只能由结构体实例化变量进行调用,示例如下:
由于结构体方法在关键字和方法名称之间需要声明结构体的值接收者和指针接收者,因此在结构体方法中还可以通过该变量访问结构体成员,比如在上述例子中定义结构体方法 init(),用于初始化结构体的成员值,示例如下:
在上述两个例子中,我们都采用结构体的指针变量作为结构体方法的接收者,如果将结构体方法的接收者改为值接收者,需要考虑结构体的数据大小、是否改变结构体成员原有数据等问题,指针接收者和值接收者的归纳如下:
在 Go 语言中,函数与方法代表不同的概念,函数是独立的,方法是指结构体方法,它依赖于结构体,但两者皆以关键字 func 定义,只是定义方式略有不同。
结构体方法的定义语法如下:
type person struct { // 定义结构体 name string weight int } // 指针接收者 func (p *person) get_name(name string) string { // 定义结构体方法 return name } // 值接收者 func (p person) get_name(name string) string { // 定义结构体方法 return name }
结构体方法与函数的区别在于结构体方法必须在关键字和方法名称之间使用小括号声明结构体变量(称为值接收者)或结构体的指针变量(称为指针接收者),如 func (p person) get_name 和 func (p *person) get_name,并且结构体方法只能由结构体实例化变量进行调用,示例如下:
package main import "fmt" type person struct { // 定义结构体 name string weight int } func (p *person) get_name(name string) string { // 定义结构体方法 return "My name is " + name } func main() { // 实例化结构体 p := person{name: "Tom", weight: 80} // 调用结构体方法 name := p.get_name(p.name) fmt.Printf("结构体方法的返回值:%v\n", name) }运行上述代码,运行结果为:
结构体方法的返回值:My name is Tom
由于结构体方法在关键字和方法名称之间需要声明结构体的值接收者和指针接收者,因此在结构体方法中还可以通过该变量访问结构体成员,比如在上述例子中定义结构体方法 init(),用于初始化结构体的成员值,示例如下:
package main import "fmt" type person struct { // 定义结构体 name string weight int } func (p *person) get_name(name string) string { // 定义结构体方法 return "My name is " + name } func (p *person) init(name string, weight int) { // 定义结构体方法,用于初始化结构体成员 p.name = name p.weight = weight } func main() { // 实例化结构体 p := person{} // 调用结构体方法,初始化成员值 p.init("Tom", 99) fmt.Printf("结构体的成员name的值:%v\n", p.name) fmt.Printf("结构体的成员weight的值:%v\n", p.weight) // 调用结构体方法 name := p.get_name(p.name) fmt.Printf("结构体方法的返回值:%v\n", name) }运行上述代码,运行结果为:
结构体的成员name的值:Tom
结构体的成员weight的值:99
结构体方法的返回值:My name is Tom
在上述两个例子中,我们都采用结构体的指针变量作为结构体方法的接收者,如果将结构体方法的接收者改为值接收者,需要考虑结构体的数据大小、是否改变结构体成员原有数据等问题,指针接收者和值接收者的归纳如下:
- 值接收者通过数据拷贝方式传递给方法,如果结构体数据较多,需要考虑资源占用情况;
- 若需修改结构体成员原有的数据,则只能使用指针接收者。由于值接收者通过数据拷贝方式传递,因此在方法中修改结构体成员值不会改变结构体成员的原有值;
- 无论结构体方法是指针接收者还是值接收者,结构体方法的调用方式都不会改变。