golang学习【8】:面向对象与面向过程

尹成学院区块链 Go 学习大纲-取得大纲试看视频联系微信yinchengak48 所处阶段 主讲内容 技术要点 学习目标 第一阶段Go语言开发入门实战 1.Go语言介绍及开发环境搭建 1.Go语言是什么 2.Go语言优势 3.Go语言适合来做什么 4.Go语言安装和设置 5.标准命令概述 6.第一个Go语言程序 课程设计理念: 夯实基础,Go语言作为... 阅读详情

面向对象与面向过程

面向对象

活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程",我们先来看看比较正式的说法。

"把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。"

这样一说好像更抽象了,我们一步步解析。

面向对象是什么
  • 对象是什么
    • 对象是现实世界实体的抽象,比如我们可以把某只猫作为一个对象,某只狗也是一个对象;这里指的是一个具体的实体,比如你家里养了猫叫小红,小红是对象,猫属于分类
  • 分类是什么
    • 分类是对一组相似对象的归纳,我们把猫和狗统称为动物,那么动物就是一个分类;当然了,我们也可以把狗看成一个分类,然后哈士奇,金毛是一个子类;家里养的金毛是对象
  • 封装是什么
    • 比如猫是会做抓这个动作的,猫产生抓这个动作的需要经过其神经和肌肉的协作协调,封装就是把这个协调过程隐藏了;就如我们看猫做出抓这个动作,并不会了解其内部神经和肌肉的协调过程
  • 继承(泛化,特化,多态)是什么
    • 猫和狗都属于动物,动物是会进行呼吸的,那么猫和狗也会呼吸,这就是继承,也是泛化;但是鱼和猫的呼吸方式是不同的,它们的内部细节不同,就属于多态;猫除了呼吸,还具备跳跃这种猫有其他动物没有的,叫特化
  • 面向对象是什么
    • 面向对象是一种编程范式或编程方法论,就是一种设计理念和方法;
为什么要用面向对象

之前我们说过"程序是指令的集合",我们在程序中书写的语句在执行时会变成一条或多条指令然后由CPU去执行。当然为了简化程序的设计,我们引入了函数的概念,把相对独立且经常重复使用的代码放置到函数中,在需要使用这些功能的时候只要调用函数即可;如果一个函数的功能过于复杂和臃肿,我们又可以进一步将函数继续切分为子函数来降低系统的复杂性。但是说了这么多,不知道大家是否发现,所谓编程就是程序员按照计算机的工作方式控制计算机完成各种任务。但是,计算机的工作方式与正常人类的思维模式是不同的,如果编程就必须得抛弃人类正常的思维方式去迎合计算机,编程的乐趣就少了很多,"每个人都应该学习编程"这样的豪言壮语就只能说说而已。当然,这些还不是最重要的,最重要的是当我们需要开发一个复杂的系统时,代码的复杂性会让开发和维护工作都变得举步维艰,所以在上世纪60年代末期,"软件危机"、"软件工程"等一系列的概念开始在行业中出现。

当然,程序员圈子内的人都知道,现实中并没有解决上面所说的这些问题的"银弹",真正让软件开发者看到希望的是上世纪70年代诞生的Smalltalk编程语言中引入的面向对象的编程思想(面向对象编程的雏形可以追溯到更早期的Simula语言)。按照这种编程理念,程序中的数据和操作数据的函数是一个逻辑上的整体,我们称之为“对象”,而我们解决问题的方式就是创建出需要的对象并向对象发出各种各样的消息,多个对象的协同工作最终可以让我们构造出复杂的系统来解决现实中的问题。

说明: 当然面向对象也不是解决软件开发中所有问题的最后的“银弹”,所以今天的高级程序设计语言几乎都提供了对多种编程范式的支持,go也不例外。

使用面向对象

简单的说,类是对象的蓝图和模板,而对象是类的实例。这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的东西。在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定义出一个叫做“类”的东西。

在 Go 语言中,虽然没有传统的“类”概念,但通过使用结构体(structs)、方法(methods)以及接口(interfaces),可以实现面向对象编程的特性,如封装、组合(而非继承)和多态。以下是一个面向对象编程的例子,展示如何在 Go 中定义结构体、为其添加方法,并使用接口实现多态性

定义类(结构体)

先来看结构体概念,一个结构体(struct)就是一组字段(field)

package main

import "fmt"

type Vertex struct {
	X int
	Y int
}

func main() {
    //结构体字段使用点号来访问。
	v := Vertex{1, 2}
	v.X = 4
    fmt.Println(v.X)
    //也可以通过指针访问
    p := &v
	p.X = 1e9
	fmt.Println(v.X)
}

用结构体来实现类的定义

package main

type Animal struct {
    Name string
    Age  int
}

// Speak 方法模拟动物发声的行为
func (a Animal) Speak() string {
    return "This animal makes an ambiguous sound."
}

// Info 方法返回动物的基本信息
func (a Animal) Info() string {
    return fmt.Sprintf("Animal: %s, Age: %d", a.Name, a.Age)
}

说明: 定义结构体的函数(方法),在函数名前用()来关联结构体,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息。

实现继承

go的继承通过在结构体中嵌入来实现继承

type Dog struct {
    Animal // 匿名嵌入 Animal 结构体
    Breed  string
}

// Speak 方法覆盖 Animal 的同名方法,为 Dog 提供具体的叫声
func (d Dog) Speak() string {
    return fmt.Sprintf("%s barks!", d.Name)
}
实现多态

golang 通过interface来实现多态

type Speaker interface {
    Speak() string
}
创建和使用对象

当我们定义好一个类之后,可以通过下面的方式来创建对象并给对象发消息。

func main() {
    // 创建 Animal 实例
    cat := Animal{Name: "Whiskers", Age: 3}
    println(cat.Speak())   // 输出:This animal makes an ambiguous sound.

    // 创建 Dog 实例
    rover := Dog{Animal: Animal{Name: "Rover", Age: 5}, Breed: "Golden Retriever"}
    println(rover.Speak())  // 输出:Rover barks!

    // 将实例赋值给 Speaker 接口类型变量,实现多态
    var speakers []Speaker
    speakers = append(speakers, cat)
    speakers = append(speakers, rover)

    // 通过 Speaker 接口调用 Speak() 方法,无需关心具体类型
    for _, speaker := range speakers {
        println(speaker.Speak())
    }
}
访问可见性问题

在 Go 语言中,结构体的字段和方法的访问可见性(也称为访问权限)由其首字母的大小写决定。Go 语言遵循“导出规则”(Export rule),简单来说就是:

  • 大写字母开头:字段或方法被视为公开的(public),可以在包外访问。这是导出(exported)的标志。
  • 小写字母开头:字段或方法被视为私有的(private),只能在包内访问。这是未导出(unexported)的标志。
type Person struct {
    name string // 私有字段,只能在定义它的包内访问
    age  int    // 私有字段,只能在定义它的包内访问

    FirstName string // 公开字段,可以在包内外访问
    LastName  string // 公开字段,可以在包内外访问
}


// 私有方法,只能在定义它的包内调用
func (p Person) fullName() string {
    return p.FirstName + " " + p.LastName
}

// 公开方法,可以在包内外调用
func (p Person) FullName() string {
    return p.FirstName + " " + p.LastName
}

golan严格保证私有属性或方法的私密性,旨在保护包的内部实现细节,确保外部代码只能通过公开(导出)的接口与包进行交互,从而提高代码的封装性和稳定性。

面向对象的支柱

面向对象有三大支柱:封装、继承和多态。这一章节已经对三者作了简单说明示例。

面向过程

和面向对象一样,面向过程是一种编程范式或编程方法论,它以过程(或称函数、子程序)作为组织和解决问题的基本单元。面向过程编程强调将一个复杂的任务分解成一系列可执行的步骤(过程),每个步骤定义为一个独立的函数,函数之间通过参数传递数据,按照预定的顺序执行,最终完成整个任务。我们前面几章的学习和练习均属于面向过程的方法。

面向过程和面向对象对比

对于golang,两者对比如下

特性/范式面向过程面向对象
基本单元函数结构体
数据与操作的组织数据与函数分离数据与行为封装
抽象级别较低级抽象较高级抽象
代码组织基于过程的模块化基于对象的模块化
复用机制函数复用结构体/接口复用
控制流过程调用与控制结构消息传递
问题建模基于任务分解基于实体与行为
典型应用领域简单系统、嵌入式系统、性能关键型软件、脚本编写复杂系统、企业级应用、图形用户界面开发、游戏开发

练习

练习1:定义一个类描述数字时钟。

参考答案:

package main

import (
	"fmt"
	"time"
)

// Clock 结构体代表一个数字时钟
type Clock struct{
    hour int
    miniute int
    second int
}

// NewClock 返回一个新的 Clock 实例,初始化时间为当前时间
func NewClock() *Clock {
	now := time.Now()
	return &Clock{
		hour:   now.Hour(),
		minute: now.Minute(),
		second: now.Second(),
	}
}

// Tick 模拟时钟每秒走动一次
func (c *Clock) Tick() {
	c.second++
	if c.second >= 60 {
		c.second = 0
		c.minute++
		if c.minute >= 60 {
			c.minute = 0
			c.hour = (c.hour + 1) % 24
		}
	}
}

// Display 打印当前时钟的时间
func (c *Clock) Display() {
	fmt.Printf("%02d:%02d:%02d\n", c.hour, c.minute, c.second)
}

func main() {
	clock := NewClock()

	for {
		clock.Tick()
		clock.Display()
		time.Sleep(time.Second)
	}
}
Go必知必会系列:面向对象编程与Go 作者:禅与计算机程序设计艺术 1.简介 Go 是由 Google 提供的开源编程语言,拥有简单、易用、高效、可靠等诸多特点。虽然Go 有着很多特性,但是其核心语言特性还是强调了易用性和高效性。Go 作为一门静态类型的语言,它的语法设计清晰、一致,便于学习和理解。相比其他编程语言来说,Go更加注重代码的可 阅读详情

相关推荐

8 Go网络服务开发进阶指南

作者:禅与计算机程序设计艺术 1.简介 Go 是 Google 开发的一门新语言,被设计用来构建简单、可靠并且快速的分布式系统。Go 语言对高并发处理、易于编写安全的代码提供了很好的支持。在 Go 语言出现之前,大部分编程语言都是面向过程的,而在过去十几年里,函数式编程和面向对象编程逐渐成为主流。Go

AI天才研究院 2131

Go可以既是面向对象,也是面向过程的?

Go不是OOP的语言,但是又允许有OOP的编程风格,他的灵活性更倾向于让开发者去考虑该怎么去用它。

梦~' 2259

【动态规划】背包问题(详细总结,很全)

暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。二维dp数组01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历一维dp数组01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。求组合数:外层遍历物品,内层遍历背包。

m0_51370744的博客 4万+

Golang 面向对象编程

Golang 面向对象编程

wgchen 584

Odoo 集成ReportBro报表设计器支持13,14,15,16,17,18,19

Odoo 集成ReportBro零代码报表设计器,ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。

zxltwins的博客 3377

如何加载交易策略EA到MT4/MT5

1、打开MT4/MT5软件 2、首先,必须有一个EA,而且必须是mq4/ex4为扩展名。点击左上角“文件”—“打开数据文件夹”,找到安装路径 3、将EA的ex4或mq4文件放到MT4目录\MQL4\Experts里面(本文以名为Demo的EA为例) 4、如果有DLL库文件,复制到experts目录下的libraries子目录中 5、如果有tpl模板文件,复制到templates目录中 6、添加完成后重启MT4,点击允许EA运行图标 7、在导航中找到刚才安装的EA,拖拽到...

weixin_41364817的博客 7362

Golang--面向对象

结构体、方法、封装、继承、接口、多态、断言

大学在读,感谢关注 2078

非华为电脑与MatePad Pro多屏协同实战:从安装管家到攻克连接难题

本文详细介绍了在非华为电脑上安装华为电脑管家并实现与MatePad Pro多屏协同的完整指南。从安装步骤、常见连接失败解决方案到华为账号绑定技巧,提供了实用的操作方法和硬件优化建议,帮助用户攻克连接难题,提升多屏协同的稳定性和流畅度。

weixin_30263073的博客 233

Golang面向对象编程(一)

Go支持面向对象编程特性,包括封装、继承和多态,但Go中没有类(class)而是基于结构体(struct)来实现OOP特性的。结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,结构体中的成员称为结构体的字段。在编程过程中,通常将一类事物的特性提取出来,形成一个结构体类型,然后基于这个结构体类型创建出多个实例。结构体定义方式Go中结构体定义的基本语法如下:// 定义结构体Age int结构体是值类型,不同结构体变量的字段是独立的,互不影响。

2021dragon的博客 2273

YOLO26涨点改进 | 全网独家,注意力创新改进篇 | Arxiv2025 | YOLO26引入MSLA多尺度线性注意力模块,高效提取多尺度特征和建模长程依赖,含多种创新改进,助力有效涨点

本文提出了一种多尺度线性注意力模块(MSLA)来优化YOLO26模型。MSLA通过并行使用不同尺寸的深度可分离卷积(3×3至9×9)提取多尺度特征,并结合线性注意力机制高效建模全局依赖关系。该模块显著提升了模型对多尺度目标的检测能力,同时保持了轻量化特性。实验表明,MSLA能有效增强小目标检测和复杂场景下的分割精度。文章详细介绍了MSLA的网络结构、核心优势及实现代码,并提供了两种集成MSLA的YOLO26改进方案,为实时目标检测任务提供了高效解决方案。

Ai缝合怪、助力小伙伴高效发论文 298

【PySide6拓展】初识QChart图表

在 PySide6 中,QtCharts模块提供了一系列强大的类,用于创建和管理图表。QChart是这个模块的核心类,它可以帮助开发者轻松地实现数据的可视化。本篇文章将介绍如何使用 PySide6 的QtCharts模块,并通过一个简单的示例教你如何快速引入QChart。QChart折线图柱状图饼图区域图它能够直观地呈现数据,同时支持交互功能,如缩放、拖拽和工具提示等。通过引入QChart,我们可以轻松实现数据的可视化,提升应用的交互性和用户体验。结合其他QtCharts。

m0_62599305的博客 822

Golang基础-面向对象篇

在Go中,空接口的声明形式是。Go语言(通常称为Golang)不使用传统的类(class)和继承(inheritance)的概念,而是通过结构体(struct)来实现面向对象编程的特性。现在有一个SuperMan类需要继承Human类,还有自己的level字段,并重写其中的Eat方法,还要能够写子类的新方法。空接口的特点是它可以保存任意类型的值,因为任何类型都至少实现了零个方法,因此都满足空接口的要求。Go语言中用继承是无法实现多态的,需要用接口(interface)实现,它的本质是一个指针。

Lum1n0us's Blog 1062

移动端实战指南:深入理解 & 接入 IAB OMSDK

OMSDK(OpenMeasurementSDK)是IABTechLab推出的标准化测量工具,用于统一移动端/原生App广告的可见性和验证流程。其核心包括Native库(采集设备数据)和OMID JavaScript层(实现通信),通过标准化接口让开发者只需接入一套SDK即可兼容多个测量厂商,减少冲突和性能损耗。v1.4版本强化了对CTV和原生App场景的支持,而v1.5新增了画中画检测等功能。集成流程需通过IAB技术实验室注册下载,并遵循严格的命名空间规则。测试阶段需嵌入验证脚本并通过指定工具验证

帅次的博客 1189

Go语言面向对象编程

Go语言中没有“类”的概念,通过struct来实现面向对象通常用于表达一个事物的全部或部分属性是一种自定义数据类型,可以封装多个基本数据类型本质是将零个或者多个任意类型的命名变量组合在一起的聚合数据类型每个变量叫做结构体的成员,变量名必须唯一,可用“_”补位支持使用自身指针类型成员匿名结构体,顾名思义,即没有名字的结构体,与匿名函数类似匿名结构体无须type关键字就可以直接使用,匿名结构体在创建的同时也要创建对象。

llllinuuu的博客 955

Unity零基础到进阶 | Unity 探针系统深度解析:光照探针、反射探针与相关技术

在 Unity 渲染管线中,探针(Probe) 是一类通过预计算或实时采样来捕捉空间光照信息的核心组件。它们弥补了传统静态光照贴图和实时光源各自的局限性,是实现高质量、高性能全局光照效果的关键工具。 本文将系统介绍光照探针(Light Probe)和反射探针(Reflection Probe)的作用与用法,分析二者之间的协同关系,并延伸介绍自适应探针体积(APV)、光照探针代理体(LPPV)、探针体积等进阶技术。

努力前行,总会成为自己心中的那道光 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java笔记(面向过程与面向对象及部分方法)

Java笔记(面向过程与面向对象及部分方法)

LLM | Agent | RAG | Java 2565

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Java面向对象学习】一张图搞定Java面向对象

刚开始学习Java的时候,一个人跌跌撞撞摸索着往前走,很多东西理解的也懵懵懂懂,后来实践的多了,才慢慢清楚;许多东西虽然很基础但是却很重要,是需要反复思考和加深理解的。【Java面向对象学习】一张图搞定Java面向对象,分享一些归纳总结后的技术干货,一张图能搞定的事,绝对不长篇大论。 大家都知道,Java面向对象是Java的一个核心,也是初学者的一个难点,所以我们从这里开始,Let’s go

monkey518的博客 4510

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

GO语言的进阶之路-面向对象编程

GO语言的进阶之路-面向对象编程                                                     https://www.cnblogs.com/yinzhengjie/p/7138769.html                                                 作者:尹正杰       当你看完这篇文章之时,我可以...

u010412301的博客 1578

Go学习圣经:0基础精通GO开发与高并发架构(1)

从Java高薪岗位和就业岗位来看,云原生、K8S、GO 现在对于 高级工程师/架构师来说,越来越重要。尼恩从架构师视角出发,基于自己的尼恩 3高架构师知识体系和知识宇宙,写一本《GO学习圣经》。

架构师尼恩 4753

go 语言学习(8)--结构体与方法

文章目录面向对象结构体定义面向接口编程遍历二叉树总结 面向对象 go只支持封装,不支持继承和多态 go是面向接口的编程,也可以说go所有对象都是继承了一个空接口 java这类面向对象的语言,三大特点封装,继承,多态,多态非常重要,可以说前面两个特点都是为了多态,所以学习go也会帮助你换个思路理解面向对象 go暂时没有泛型,不过2据说要出泛型 我们都知道c语言是典型的面向过程的,但是 c有结构体这种...

weixin_42259580的博客 334

Go语言方法和接收器、为任意类型添加方法_go 任意类型,2024年最新一线互联网架构师筑基必备技能之Golang篇

方法就是作用在接收器(receiver)上的一个函数;某个类型的变量;为什么有函数了还需要方法呢?Go不是纯粹的面向对象编程语言,而且Go不支持类。因此基于类型的方法是一种实现和类相似行为的途径相同的名字的方法可以定义在不同的类型上,而相同名字的函数是不被允许的。在Go语言中,结构体就像是其他语言中类的一种简化形式,那么类的方法在哪里呢?

2401_84267675的博客 1906

go学习之简单项目

把记账软件的功能封装到一个结构体中,然后调用该结构体的方法来实现记账,显示明细就可以了,结构体的名字为FamilyAccount。y/n",必须输入正确的y/n,否则循环输入指令,直到输入y或者n。编写customerView.go另外可以把customer.go和customerDervice.go协商。需要编写CustomerView和customerService,Customer类。2.当没有任何收支明细时,提示“当前没有收支明细。思路分析:给出的界面完成,主菜单的显示,当用户输入4的时候就退出。

weixin_55418082的博客 647

Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现

前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; Golang 中的 面向对象 什么是面向对象? 面向对象是一种编程思想, 并不是某一种开发语言独属; 那什么是对象? 对象,指的是客体。所谓客体是指客观...

weixin_30379973的博客 219

Java vs C++ vs Go:三大编程语言深度对比与选型指南

Java vs C++ vs Go:三大编程语言深度对比与选型指南

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 4621

go c 语言,c语言与go语言的区别有哪些

c语言与go语言的区别有哪些发布时间:2021-03-04 15:10:52来源:亿速云阅读:92作者:小新小编给大家分享一下c语言与go语言的区别有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!区别:1、C语言源文件的扩展名是“.h”和“.c”,Go语言源文件的扩展名是“.go”。2、C语言中通过文件来管理代码,Go语言中通过包来管理代码。3、C语言中一共有32个关键字,G...

weixin_33702545的博客 2468

golang基础学习

用代码学习golang;用开源项目学习整个项目的框架逻辑。

喵子K 1473
上一篇: golang学习【7】字符串和常用数据结构
下一篇: golang学习【9】:面向对象进阶
一叶萩Charles
博客等级 码龄9年 268粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶萩Charles

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值