方法基础篇
方法基础篇
1. 方法
方法必须有一个接收者
,这个接收者是一个类型(这个类型可以是Go自带的类型,也可以是我们自己定义的类型),这样方法
就和这个类型绑定在一起,称为这个类型的方法
type Age uint8
func (age Age) String() {
fmt.Println("the age is:", age)
}
func main() {
age := Age(25)
age.String() // 调用方法
}
例如上面示例,String() 就是方法名
,中间的是接收者,接收者
的定义和普通变量一样、函数参数一样,前面是变量名,后面是接收者类型。可以看到,自定义类型
是可以有自己的方法
的!这在程序中会给我们提供很大的帮助和灵活性。
2. 指针类型接收者
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. 方法名赋给变量
函数是可以赋给变量的,在函数的博客有介绍。那么方法是否可以呢,又怎么调用呢?
age := Age(25) // 创建对象,值是25
sm := Age.String // 方法名给变量
sm(age) // 通过变量调用方法,要传一个接收者进行调用
循规蹈矩写就可以了,不推荐上面的写法。可读性太差了。
上面例子不是很好。但可以借助这个例子理解一下,方法的定义
,接收者
等概念。
5. 总结
- 方法的核心在于Receiver,区分函数和方法,主要
看代码结构
,因为有时候函数的参数也是type型,容易弄混。 - 方法的
调用
也需要recevier来调用,而函数直接调用就可以了。 - 尽可能使用
指针型recevier