Go语言学习笔记(六)面向对象

1.面向对象的特性:

封装继承多态是面向对象的三大特性.

2.Go语言实现封装:

go语言中最贴近对象和类概念的无疑结构体,结构体中包含多个字段.某个函数还可以通过将结构体指定为结构体来实现绑定.

2.1demo:

go 复制代码
package main

import "fmt"

func main() {

	worker := Worker{
		Name: "itBo",
		Age:  18,

		hobby: "学习go语言",
	}

	worker.do()
}

type Worker struct {
	Name string

	Age int

	hobby string
}

func (worker Worker) do() {
	fmt.Println(worker.Name, "正在努力的学习")
}

2.2执行结果:

3.值类型绑定方法:

go 复制代码
package main

import "fmt"

func main() {

	worker := Worker{
		Name: "itBo",
		Age:  18,

		hobby: "学习go语言",
	}

	worker.do()
	fmt.Println("当前学习的人", worker.Name)
}

type Worker struct {
	Name string

	Age int

	hobby string
}

func (worker Worker) do() {
	fmt.Println(worker.Name, "正在努力的学习")
	worker.Name = "itBoBo"
}

3.1执行结果:

从输出内容看出,name字段并未改变.

4.方法绑定指针上:

go 复制代码
package main

import "fmt"

func main() {

	worker := &Worker{
		Name: "itBo",
		Age:  18,

		hobby: "学习go语言",
	}

	worker.do()
	fmt.Println("当前学习的人", worker.Name)
}

type Worker struct {
	Name string

	Age int

	hobby string
}

func (worker *Worker) do() {
	fmt.Println(worker.Name, "正在努力的学习")
	worker.Name = "itBoBo"
}

4.1执行结果:

从输出结果可以看出,成功修改了name字段.

5.Go语言继承:

5.1组合实现继承:

go 复制代码
package main

import "fmt"

func main() {

	people := People{
		name: "itbo",
	}

	stu := Student{
		people: people,
	}

	stu.people.speak()

}


type People struct {
	name string
}

func (people *People) speak() {
	fmt.Println("我的名字是:", people.name)
}

type Student struct {
	people People
}

5.2执行结果:

5.3字段匿名优化:

go 复制代码
package main

import "fmt"

func main() {

	people := People{
		name: "itbo",
	}

	stu := Student{
		people,
	}

	stu.speak()

	fmt.Printf("%+v", stu)

}


func (people *People) speak() {
	fmt.Println("我的名字是:", people.name)
}

type Student struct {
	People
}

5.4执行结果:

5.5多继承:

go 复制代码
package main

import "fmt"

func main() {

	people := People{
		name: "itbo",
	}

	score := Candidate{
		score: 95,
	}

	stu := Student{
		people,
		score,
	}

	//调用people的speak方法.
	stu.speak()

	//调用Candidate的score方法.
	stu.scoreTotal()

	fmt.Printf("%+v", stu)
}

type People struct {
	name string
}

func (people *People) speak() {
	fmt.Println("我的名字是:", people.name)
}

type Student struct {
	People
	Candidate
}

type Candidate struct {
	score int
}

func (Candidate Candidate) scoreTotal() {
	fmt.Println("我的总分是", Candidate.score)
}

5.6执行结果:

6.Go语言多态:

从前面的例子可以看出Go语言的继承是一种伪继承.可以通过接口来实现多态.

6.1方法重写无法实现多态.

go 复制代码
type defaultPlayer struct {
	name string
}

func (defaultPlayer *defaultPlayer) train()  {
	fmt.Println("开始训练")
}

func (defaultPlayer *defaultPlayer) run()  {
	fmt.Println("开始跑步热身")
}


package main

import "fmt"

func main() {

	itboFoot := footBallPlayer{
		defaultPlayer{
			name: "itbo",
		},
	}
	itboFoot.train()

	itboBasket := basketBallPlayer{
		defaultPlayer{
			name: "itbo",
		},
	}
	itboBasket.train()
}

type footBallPlayer struct {
	defaultPlayer
}

func (footBallPlayer *footBallPlayer) train() {
	fmt.Println("足球运动员开始训练了")
}

type basketBallPlayer struct {
	defaultPlayer
}

func (basketBallPlayer *basketBallPlayer) train() {
	fmt.Println("篮球运动员开始训练了")
}

type defaultPlayer struct {
	name string
}

func (defaultPlayer *defaultPlayer) train() {
	fmt.Println("开始训练")
}

func (defaultPlayer *defaultPlayer) run() {
	fmt.Println("开始跑步热身")
}

6.2执行结果:

从结果中可以看粗并没有调用重写的方法.因为组合底层调用的不是一个对象,所以这样行不通.

7.Go语言接口:

scss 复制代码
type interfaceOne interface {
	method1()
	method2()
}

​接口的定义也是使用type关键字,代表接口也是自定义类型.只是其中声明了若干方法,这些方法不需要方法体.当结构体或者数据类型实现了某个接口的所有方法,就可以说这个结构体或者数据类型实现了这个接口.如果某个接口没有方法声明,也可以称作空接口.

7.1接口实现多态:

go 复制代码
package main

import "fmt"

func main() {

	footPlayer := &footBallPlayer{defaultPlayer{"itbo"}}
	baskePlayer := &basketBallPlayer{defaultPlayer{"itbo"}}

	footPlayer.sign(footPlayer)
	baskePlayer.sign(baskePlayer)

}

type Player interface {
	train()
}

func (defaultPlayer *defaultPlayer) sign(player Player) {
	fmt.Println(defaultPlayer.name, "签到")
	player.train()
}

type footBallPlayer struct {
	defaultPlayer
}

func (footBallPlayer *footBallPlayer) train() {
	fmt.Println("足球运动员开始训练了")
}

type basketBallPlayer struct {
	defaultPlayer
}

func (basketBallPlayer *basketBallPlayer) train() {
	fmt.Println("篮球运动员开始训练了")
}

type defaultPlayer struct {
	name string
}

func (defaultPlayer *defaultPlayer) train() {
	fmt.Println("开始训练")
}

func (defaultPlayer *defaultPlayer) run() {
	fmt.Println("开始跑步热身")
	defaultPlayer.train()
}

7.2执行结果:

从demo可以看出,实现接口并不需要特殊的关键字.

8.接口嵌套:

go 复制代码
type Tran interface {
	Tran()
}

type Application interface {
	render()

	Tran
}

8.1接口嵌套运用:

go 复制代码
type HttpProtocol struct {

}

func (HttpProtocol *HttpProtocol) Tran(){
	fmt.Println("tran")
}

func (HttpProtocol *HttpProtocol) render(){
	fmt.Println("render")
}

type Tran interface {
	Tran()
}

type Application interface {
	render()

	Tran
}

package main

import "fmt"

func main() {

	//定义为接口类型
	var protocol Application

	protocol = &HttpProtocol{}

	protocol.render()
	protocol.Tran()
}

8.2执行结果:

语雀地址www.yuque.com/itbosunmian...?

《Go.》 密码:xbkk 欢迎大家访问.提意见.

相关推荐
2601_962055976 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿7 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_21696290968 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理9 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒9 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构11 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构11 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构11 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常12 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端
LinMINGJing00712 小时前
PageHeaderData:Page 的页面头
后端