1、方法定义及使用
go中的方法是一个包含了接受者的函数,接受者可以是命名类型或结构体类型的一个值或者一个指针,语法格式如下:
func (variable_name variable_data_type) function_name() [return_type]{
/* 函数体*/
}
示例:
type User struct {
Name string
Email string
}
//定义一个方法
func (u User) Notify() {
fmt.Printf("%v : %v \n", u.Name, u.Email)
}
func main() {
// 值类型调用
u1 := User{"golang", "zhangLC.com"}
u1.Notify()
// 指针类型调用
u2 := User{"go", "zhang.com"}
u3 := &u2
u3.Notify()
}
结果打印:
分析:
从代码中看出 Notify 方法的接受者是一个 User 类型的 值。要调用 Notify 方法需要一个传一个 User 类型的值或者指针。
注意:当接受者不是指针时,那么这个方法操作的是对应接受者的值的副本(即使你使用了指针调用函数,但是函数的接受者是值类型,所以函数内部操作还是对副本的操作,而不是指针操作。)
当然,当接受者是指针时,即使是使用值类型调用那么函数内部也是对指针的操作。
2、普通函数与方法的区别
-
在普通函数中,如果接收者为值类型,那么不能将指针类型的数据直接传递,反之亦然。
-
在方法(如struct的方法)中,如果接收者为值类型,那么可以直接用指针类型的变量调用方法,反过来也可以。