面向对象
GO也支持面向对象编程,但是和传统的面向对象有区别,并不是纯粹的面向对象语言。所以我们说GO支持面向对象特性是比较准确的
GO没有类,Go语言的结构体(struct)和其他语言的类(Class)有同等地位,你也可以理解Golang是基于Struct来实现OOP概念的
go语言面向对象非常简洁,去掉了传统OOP语言的继承,方法重载,构造函数和析构函数等等
面向对象的三大特征:封装、继承、多态。go只支持封装。
方法:
在面向对象语言中,方法也就是类中的函数。但是由于Go语言其实明确的OOP的概念,Go中的类都是用结构体来实现的。
声明
方法的声明和函数也差不多,只是要指定下接收者而已
func (t T) F() {}
方法名是不能重复的,这就让GO的方法没有了重载的特性
示例:
package main
import "fmt"
type Student struct {
}
func (s Student) sayhello() {
fmt.Println("hello student and method")
}
func main() {
s := Student{}
s.sayhello()
}
输出:
hello student and method
方法名和字段名是不能一样的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AONZdWUb-1673322680952)(…/images/Pasted%20image%2020230109205114.png)]
想要修改结构体中的值修改,要传入指针
package main
import "fmt"
type Student struct {
name string
age int
}
func (s Student) sayhello() {
fmt.Println("hello student and method")
}
//func (s Student) name() {
//
//}
func (s Student) addAge() {
s.age += 1
}
func (s Student) printAge() {
fmt.Println(s.name, "的年龄是:", s.age)
}
func main() {
s := Student{"simple", 18}
s.sayhello()
s.addAge()
s.printAge()
}
输出:
hello student and method
simple 的年龄是: 18
没有加一
所以这里是值传入,只是一个copy,要想修改年龄,要传入指针
package main
import "fmt"
type Student struct {
name string
age int
}
func (s Student) sayhello() {
fmt.Println("hello student and method")
}
//func (s Student) name() {
//
//}
func (s *Student) addAge() {
s.age += 1
}
func (s Student) printAge() {
fmt.Println(s.name, "的年龄是:", s.age)
}
func main() {
s := Student{"simple", 18}
s.sayhello()
s.addAge()
s.printAge()
}
输出:
hello student and method
simple 的年龄是: 19
down
🥱