这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
一、本堂课重点内容
本堂课的知识要点有哪些?
- Go语言结构体的方法
二、详细知识点介绍
本堂课介绍了哪些知识点?
Go语言结构体的方法
-
方法最本质的含义是对数据的操作,在形式上类似函数。方法是作用在数据类型上的,因而,不只是结构体类型有方法,Go语言中几乎所有数据类型都可以有方法(除了接口有抽象方法)。
-
从定义上来说,Go语言的方法是作用在接受者(receiver)上的一个函数,这个接受者的概念很重要,它是Go语言中任意一种数据类型变量或指向变量的指针。
-
接受者不可以是抽象的接口及指向指针的指针,但可以是指向其它数据类型的指针。
-
一个类型加上其方法就像是面向对象的一个类,但是类有封装特性,数据和方法必须封装在一起。而在Go语言中没有封装的概念,数据和方法可以分开存放,处于不同的源文件,只要在同一个包里即可。
-
方法是动作函数,所以要符合函数的定义,同时动作需要有接受者,因而声明中还要体现接受者。Go语言的方法声明语法格式如下:
func (r r_type)methName(para_list)(return_list){block} -
接受者(
r)是方法作用的类型实例,是方法的接受对象。可以是值或地址形式,如果是地址,则Go语言会自动解析其引用值。此外,Go语言允许使用匿名接受者,用空_字符来代替,或者不写r,但是r_type是不能省略的。 -
接受者类型(
r_type)可以是值类型或指针类型,通常情况下,值类型的接受者,其方法的作用对象是值的副本,意味着方法对其原值没有影响。而指针类型指向的是接受者的地址,方法通过地址直接作用在原值上。 -
方法名称(
methName)是任何合法的Go语言标识符,命名规则遵循Go语言的可见性原则,小写字母开头仅包内可见,大写字母开头为可导出型,为包间可见。 -
方法名可以与接受者类型同名,这样的方法只有一个。
-
Go语言的方法不允许重载。
-
同一个包内不同的接受者的方法可以同名。
-
类型与其上定义的方法必须在同一个包内。
-
方法是直接定义在类型上的,方法必须与类型相关联。方法离开了类型,就不成为方法,而是普通的函数了。因此,类型方法是两位一体的,类型依赖方法来执行动作;方法依赖类型来提供接受者。
-
一个类型可以定义多种方法,执行不同的动作,产生不同的结果。比如说鼠标类型,可以有:单击、双击、左键、右键、滚轮、按住拖曳等等多种动作,我们就可以为鼠标类型定义多种方法。
-
方法到底是用接受者值类型还是接受者指针类型,就看是否需要改变接受者的状态来判断,如果需要改变接受者状态,就用指针类型;如果不能改变接受者状态,就用值类型。