golang 方法和接收者

方法和接收者

Go语言中的方法是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者。接收者的概念类似于其它语言中的this 或者self。

接收者的参数在命名时,官方建议使用接收者类型名的第一个小写字母。
接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
方法名、参数列表、返回参数:具体格式与函数定义相同

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package main

import "fmt"

// Server是一个结构体
type server struct {
name string
ip string
}

// 构造一个Server的函数
func NewServer(name,ip string) *server{

return &server{
name:name,
ip:ip,
}
}

//函数不属于任何类型,可以在任何地方调用

//方法属于具体类型

//定义方法 Check and Ping
func (s server) Check(){
fmt.Printf("%s\n",s.ip)
}

func (s server) Ping(){
fmt.Printf("正在检查ping %s\n",s.ip)
}



func main(){

server1 := NewServer("news","192.168.1.2")
server1.Check()
//(*server1).Ping()
server1.Ping()

}

指针类型的接收者

指针类型的接收者由一个结构体指针组成,由于指针特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。例如修改服务器IP

1
2
3
4
5
6
7
//指针接收者,类型是指针
func (s *server) ChangeIp(ip string){
fmt.Println("修改前的IP:",s.ip)

s.ip=ip
fmt.Println("修改后的IP:",s.ip)
}

调用方法

1
2
3
4
5
6

server1 := NewServer("news","192.168.1.2")
server1.Check()
//(*server1).Ping()
server1.Ping()
server1.ChangeIp("10.10.10.2") // 修改IP

值类型的接收者

1
2
3
4
5
6
7
//值接收者不会修改原来的值,只作用于当前函数
func (s server) ChangeValueIp(ip string){
fmt.Println("修改前的IP:",s.ip)

s.ip=ip
fmt.Println("修改后的IP:",s.ip)
}

使用情况下使用指针类型

1.需要修改接收者中的值
2.接收者是拷贝代价比较大的对象
3.保证一致性,如果某个方法使用了指针接收者,那么其它的方法也应该使用指针接收者。