📅 2024年5月9日
📦 使用版本为 1.21.5
方法
1️⃣ 方法的概念
⭐️ 在 Go
语言中没有类这个概念,可以使用结构体来实现,那类方法呢?Go
也同样的实现,那就是方法
⭐️ 方法和函数长得很像,但是它多出来了一个"接收者"的选项(我也不知道为啥要这么高大上的名字,看书的时候都给我看蒙蔽了),其实就是和一个结构体(类),或者一个类型进行绑定比如下面的列子
this
表示 one
这个类,和 java
中的 this
或者 python
的 self
类似表示当前类,也就是表示这个方法是属于one类的
type one struct {
a int
b int
}
func (this one) GetA() {//this类似于java中的this,表示这个类
println(this.a)
}
func main() {
one := &one{1, 2} //这里有没有很像创建一个类
one.GetA() //然后调用类方法
}
⭐️ 接收者的类型,可以是 int
,bool
,string
,数组
,函数
的别名(经过 type
定义的)类型,但是不能是一个接口类型,接口是一个抽象定义,方法是具体的实现,而且还不能是一个指针类型,但是可以是可以是前面几种类型的指针类型
⭐️ 在 go
中方法和类可以不用写在一个源代码(体现的很明显了),可以分开写,但是必须在同一个包内!
⭐️ 方法在一个接收者类型中只能存在一个(名字),不能存在多个,但是可以在不同接收者类型中多个(名字)
//不同的接收者类型
func (this two) GetA() {
println(this.a)
}
func (this one) GetA() {
println(this.a)
}
⭐️ 如果想定义的方法可以在外部调用(你可以发现 Go
中已经实现的方法如 fmt.Println
它们都是开头首字母大写),前面说过,需要首字母大写
⭐️ 绑定类型(传入接收者)最好是使用指针类型,否则传入的接收者类只是类的一个拷贝,下面这个列子就体现出来了
ps: 这里的
Set
和Get
很像java
对不对
type one struct {
a int
b int
}
func (this one) GetA() {
println(this.a)
}
func (this one) SetA(i int) int { //修改a
this.a = i
return this.a
}
func main() {
one := &one{1, 2}
one.GetA() //输出1
one.SetA(3) //使用Set方法修改为 3
one.GetA() //输出1
}
如果换成指针
type one struct {
a int
b int
}
func (this *one) GetA() {
println(this.a)
}
func (this *one) SetA(i int) int { //使用指针类型
this.a = i
return this.a
}
func main() {
one := &one{1, 2}
one.GetA() //输出1
one.SetA(3) //使用Set方法修改为 3
one.GetA() //输出3
}
😀 学到这里我直接懂了!这玩意和类差不多,甚至可以可以定义自己的 get
、set
方法,包括 toString
也可以,(幸好之前学完了 java
)
type Person struct {
Name string
age int
sex string
}
func (this *Person) GetName() { //get方法
println(this.Name)
}
func (this *Person) SetName(i string) string { //set方法
this.Name = i
return this.Name
}
func (this *Person) ToString() { //Tostring方法
fmt.Println(
"name :", this.Name,
", age :", this.age,
", sex :", this.sex,
)
}
func main() {
p1 := Person{"zhangsan", 18, "man"}
p1.ToString()
}
⭐️ 对象的字段不应该由2个或2个以上的不同线程在同一时间去改变(在后面会学解决办法)
🌟 内嵌类型的方法和继承
⭐️ 一个匿名类型被嵌入到结构体中,匿名类型的可见方法也同样被内嵌,相当于继承
🌟 多重继承
⭐️ 简单来说就是一个一个子类可以继承多个父类,在 Java
中是不被允许的,但是在 Go
结构体匿名字段下可以实现,只需要通过内嵌两个就好了
type Person struct { //人的基本
Name string
age int
sex string
}
type Student struct { //学生
School string
score int
ranked int
}
type You struct { //你
Person //你是个人也是一个学生
Student
}
func main() {
p1 := You{
Person: Person{"lisi", 18, "男"},
Student: Student{"茶啊二中", 99, 1},
}
fmt.Println(p1)
}