非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第9章 结构体
- 9.5 结构体方法
- 9.5.1 指针类型接收者
- 9.5.2 值类型接收者
第9章 结构体
9.5 结构体方法
Go语言中,一个方法就是一个包含了接收者的函数。
对于结构体方法,接收者可以是结构体类型的值或是指针。
9.5.1 指针类型接收者
当接收者类型为指针时,可以通过该方法改变该接收者的成员变量值,即使你使用了非指针类型实例调用该函数,也可以改变实例对应的成员变量值。
在以下示例中,我们为User结构体创建了ChangeName方法,在该方法内部将接收者的Name值修改为Tom,接收者的类型为指针类型:
[ 动手写9.5.1 ]
package main
import "fmt"
type User struct {
Name string
Email string
}
func (u *User) ChangeName() { // 指针类型接收者
u.Name = "Tom"
}
func main() {
u := &User{"Peter", "go@go.com"} // 创建指针类型结构体实例
fmt.Println("Name: ", u.Name, " Email: ", u.Email)
u.ChangeName()
fmt.Println("Name: ", u.Name, " Email: ", u.Email)
}
运行结果
只要结构体方法的接收者为指针类型,即使实例不是指针类型,修改也能生效:
[ 动手写 9.5.2 ]
package main
import "fmt"
type User struct {
Name string
Email string
}
func (u *User) ChangeName() { // 指针类型接收者
u.Name = "Tom"
}
func main() {
u := User{"Peter", "go@go.com"} // 创建非指针类型结构体实例
fmt.Println("Name: ", u.Name, " Email: ", u.Email)
u.ChangeName()
fmt.Println("Name: ", u.Name, " Email: ", u.Email)
}
运行结果
9.5.2 值类型接收者
当接收者不是一个指针时,该方法操作对应接收者值的副本,否则即使你使用了指针调用函数,也无法改变成员变量值。
[ 动手写 9.5.3]
package main
import "fmt"
type User struct {
Name string
Email string
}
func (u User) ChangeName() { // 值类型接收者
u.Name = "Tom"
}
func main() {
u := &User{"Peter", "go@go.com"} //创建指针类型结构体实例
fmt.Println("Name: ", u.Name, " Email: ", u.Email)
u.ChangeName()
fmt.Println("Name: ", u.Name, " Email: ", u.Email)
}
运行结果
如果方法需要修改接收者,接收者必须是指针类型。一般约定的接收者命名是类型的一个或两个字母的缩写(如u或者us之于User)。