视频来源:B站《golang入门到项目实战 [2022最新Go语言教程,没有废话,纯干货!]》
文章为自己整理的学习笔记,侵权即删,谢谢支持!
文章目录
一 golang方法简介
go语言没有面向对象的特性,也没有类对象的概念。但是,可以使用结构体来模拟这些特性,我们都知道面向对象里面有类方法等概念。我们也可以声明一些方法,属于某个结构体。
Go中的方法,是一种特殊的函数,定义于结构体struct之上(与struct关联、绑定),被称为struct的接受者(receiver)。通俗的讲,方法就是有接收者的函数。
1.1 语法
type mytype struct{
}
func (recv mytype) my_method(para) retrun_type {
}
func (recv *mytype) my_method(para) return_type {
}
mytype
:定义的一个结构体
recv
:接受该方法的结构体(receiver)
my_method
:方法名称
para
:参数列表
return_type
:返回值类型
从语法格式可以看出,一个方法和一个函数非常相似,只不过多了一个接受类型。
1.2 实例演示
package main
import "fmt"
type Person struct {
name string
}
func (per Person) eat() {
fmt.Println(per.name + " eating....")
}
func (per Person) sleep() {
fmt.Println(per.name + " sleep....")
}
func main() {
var per Person
per.name = "tom"
per.eat()
per.sleep()
}
运行结果:
tom eating....
tom sleep....
1.3 注意事项
- 方法的receiver type并非一定要是struct类型,type定义的
类型别名
、slice
、map
、channel
、func
类型等都可以。 - 结构体struct结合它的方法就等价于面向对象中的类。只不过struct可以和它的方法分开,并非一定要属于同一个文件,但必须属于同一个包。
- 方法有两种接收类型:
(T Type)
和(T *Type)
,它们之间有区别。 - 方法就是函数,所以Go中没有方法重载(overload)的说法,也就是说同一个类型中的所有方法名必须都唯一。
- 如果receiver是一个指针类型,则会自动解除引用。
- 方法和类型是分开的,意味着实例的行为和数据存储是分开的,但是它们通过receiver建立起关联关系。
二 golang方法接收者类型
结构体实例有值类型和指针类型,而方法的接收者是结构体,那么也有值类型和指针类型。区别就是接收者是否复制结构体副本。
值类型复制,指针类型不复制。
2.1 值类型结构体和指针类型结构体
先看一段代码: