方法基础篇

方法基础篇

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
posted @ 2022-08-30 11:34  sunnybowen  阅读(21)  评论(0编辑  收藏  举报