一、在Golang中,函数和方法是不一样的,函数没有接收者,而方法有接收者,接收者是某个结构体类型的变量。
其中方法的接受者有两种:
value receiver(值接收者,只能获取结构体变量的属性),
pointer receiver(指针接收者,还可以通过方法参数改变结构体变量的属性)
方法:(接收者可以理解为调用该方法的结构体实例,即调用者)
-
值接受者(和值传递概念相同,只是值拷贝给接收者参数)
func (valueReceiver receiverType) funcName(params type) returnValues type{
}
或 -
指针接收者(接收者是结构体类型变量指针,即变量的地址,所以可以改变变量的属性值)
func (pointerReceiver *receiverType) funcName(params type) returnValues type{
}注:方法常用在实现接口方法时。
函数:
func funcName(params type) returnValues type{
}
有地方解释:pointer receiver的方法接收者既可以传值也可以传指针,事实上pointer receiver的方法只是将receiver.funcName()自动转换为(&receiver).funcName(),同样地,把value receiver 指向变量。这点官方的go有说明,go编译器自动取了变量的地址。
下面通过几个例子说明区别和细节:
package main
import "fmt"
type Stu struct {
}
func (s Stu) pt1(str string){
//值接受者
fmt.Println(str)
}
func (s *Stu) pt2(str string){
//指针接受者
fmt.Println("func pt2 ",s)
fmt.Println(str)
}
func main() {
s1 := new