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 欢迎大家访问.提意见.

相关推荐
San813_LDD1 小时前
[后端开发]GET/POST_带参/不带参
前端·后端·计算机网络·json
白露与泡影1 小时前
SEATA:Server 到 Golang Client 全链路走读
开发语言·后端·golang
小江的记录本1 小时前
【Spring全家桶】Spring Cloud 2023.0.x:配置中心:Nacos Config、Apollo(附《思维导图》+《面试高频考点清单》)
java·spring boot·后端·python·spring·spring cloud·面试
IT_陈寒1 小时前
Redis的LRU淘汰策略坑了我一天血汗
前端·人工智能·后端
jeffer_liu11 小时前
Spring AI 生产级实战:裁判员
java·人工智能·后端·spring·大模型
金銀銅鐵12 小时前
用 Tkinter 实现简单的猜数字游戏
后端·python
copyer_xyf12 小时前
Python 模块与包的导入导出
前端·后端·python
夜微凉412 小时前
三、Spring
java·后端·spring
copyer_xyf12 小时前
Python venv 虚拟环境
前端·后端·python