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)。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧