目录

方法基础篇

1. 方法

方法必须有一个接收者,这个接收者是一个类型(这个类型可以是Go自带的类型,也可以是我们自己定义的类型),这样方法就和这个类型绑定在一起,称为这个类型的方法

1
2
3
4
5
6
7
8
type Age uint8
func (age Age) String() {
	fmt.Println("the age is:", age)
}
func main() {
	age := Age(25)
	age.String()  // 调用方法
}

例如上面示例,String() 就是方法名,中间的是接收者,接收者的定义和普通变量一样、函数参数一样,前面是变量名,后面是接收者类型。

2. 指针类型接收者

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
type Age uint8
// 值类型接收者
func (age Age) String() {
	fmt.Println("the age is:", age)
}
// 指针类型接收者
func (age *Age) Modify() {
	*age = Age(30)
}
func main() {
	age := Age(25)
	age.String()
	age.Modify()
  (&age).Modify()
	age.String()
}

如果使用值类型调用指针类型接受者的方法,Go语言编译器会自动帮我们取指针调用

如果使用指针类型调用值类型接收者的方法,Go语言会自动帮我们解引用调用

我们在实际编码中不需要关注上面两点,不需要关注调用者是谁。需要关注的是,如果需要修改值,那么最好还是使用指针型接收者。

3. 函数和方法

  • 调用方法的时候本质上是副本,一个是值的副本,一个是指针的副本。

  • 函数和方法两个概念基本相同,不同的是所属的对象,不管是函数还是方法,它们都是代码复用的第一步,也是代码职责分离的基础,降低代码的重合度。

  • 函数直接调用就可以,是属于package的。方法是属于对象的。调用的时候需要对象.方法名()

4. 方法名赋给变量

函数是可以赋给变量的,在函数的博客有介绍。那么方法是否可以呢,又怎么调用呢?

1
2
3
age := Age(25)    // 创建对象,值是25
sm := Age.String  // 方法名给变量
sm(age)           // 通过变量调用方法,要传一个接收者进行调用

循规蹈矩写就可以了,不推荐上面的写法。可读性太差了。

上面例子不是很好。但可以借助这个例子理解一下,方法的定义接收者等概念。

5. 总结

  • 方法的核心在于Receiver,区分函数和方法,主要看代码结构,因为有时候函数的参数也是type型,容易弄混。
  • 方法的调用需要recevier来调用,而函数直接调用就可以。
  • 尽可能使用指针型recevier