go里面面向对象
基础知识
因为方法和结构体是在一起使用的所以首先定义结构体
1 2 3 4 | type Student struct { Name string Age int } |
定义结构体对应方法通过参数绑定调用的结构体
func (persion Persion) Learing() {
}
#备注:persion Persion适合方法在一起使用的所以和结构体关联如上面使用如图例:
p1:= Persions{"lisi",20}; fmt.Println(p1.Name);
完整代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package main import "fmt" type Persions struct { Name string Age int } func (persion Persion) Learing() { } func main() { p1:= Persions{ "lisi" ,20}; fmt.Println(p1.Name); } |
重要:因为结构体是值传递,所以如果方法里面修改数据,在外面获取不到
继承
通过讲目标 匿名引入结构体可实现继承
package main import "fmt" type Persion struct { Name string Age int } type Student struct { Persion //写入结构体继承 } func ( p * Persion) Add(name string, age int){ p.Name = name p.Age=age } func (p * Persion) Show() { fmt.Println(p.Name,p.Age) } func (s * Student)Learn(){ fmt.Println(s.Name,"学习") } func main(){ s1:=Student{} s1.Add("lisi",20) s1.Learn() }
封装
在go语言的结构体中,大写字母开头的属性是包外可用的,小写字母开头的属性是只有包内可用的。相比java,没有protected的概念。java的私有变量,大部分情况还需要写getter、setter方法去暴露出来,这其实造成了很多的代码冗余,其实大可不必。
接口和多态
package main import "fmt" type Aninmal interface { Eat(food string) Run() } type Dog struct {} func (d Dog) Eat(food string){ fmt.Println("dog eat"+food) } func (d Dog) Run(){ fmt.Println("is run") } type Cat struct {} func (c Cat)Eat(food string){ fmt.Println("cat eat "+ food) } func (c Cat) Run(){ fmt.Println("is runding") } func main(){ var animal Aninmal animal = Dog{} animal.Eat("吃肉") animal.Run() animal= Cat{} animal.Eat("虫子") animal.Run() }
go如何多继承?
在java中,一个对象只能继承自一个类,但是可以实现多个接口。
在go中可以通过引入多个匿名结构体以实现多继承,至于实现多个接口,只需要把这些接口的方法都实现即可。
下例分别实现了多继承和实现多个接口,鸟实现了飞和叫的接口。鸭子继承了鸟和卵生动物。因此鸭子也拥有了飞、叫、下蛋的行为
package main import "fmt" type Flyer interface { Fly() } type Speaker interface { Speak() } type Bird struct { } func (b Bird) Fly() { fmt.Println("飞啊飞...") } func (b Bird) Speak() { fmt.Println("鸟叫") } // Waterfowl 水禽 type Waterfowl interface { // Swim 水禽都会游泳 Swim() } // Oviparous 卵生动物 type Oviparous struct { } func (o Oviparous) LayEggs() { fmt.Println("下蛋了") } // Duck 鸭子继承了鸟和卵生动物 type Duck struct { Bird Oviparous } func main(){ du:=Duck{} du.Fly() }
重载
go允许覆盖匿名结构体的方法以实现重载,例如上例中,鸭子的叫声应该是“嘎嘎嘎”:
func (d Duck) Speak() { fmt.Println("鸭子叫:嘎嘎嘎") }
接口嵌套
嵌套得到的接口的使用与普通接口一样,只要实现包含的所有方法即可实现接口。
// Sayer 接口 type Sayer interface { say() } // Mover 接口 type Mover interface { move() } // Human 接口嵌套 type Human interface { Sayer Mover }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】