golang学习笔记19-面向对象(一):面向对象的引入

news/2024/12/21 21:52:08/

注:本人已有C,C++,Python基础,只写本人认为的重点。
这节开始就是面向对象的内容了,为方便复用结构体等类型,本人定义了一个utils包,用于定义这些类型,之后的文章也会用到,希望读者注意。
(1)golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说golang支持面向对象编程特性是比较准确的。
(2)golang没有类(class),go的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解golang是基于struct来实现OOP特性的。
(3)golang面向对象编程非常简洁,去掉了传统OOP语言的方法重载、构造函数和析构函数、隐藏的this指针等等
(4)golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:go没有extends 关键字,继承是通过匿名字段来实现。
结构体的作用和C/C++一样,其在go中的定义如下:

package utilsimport "fmt"//为方便其他包使用,结构体名和字段名的首字母都要大写
type Person struct {Name stringAge  intSex  string
}

和切片,map一样,结构体也有三种创建方式:

package mainimport ("course/chap10oop/utils""fmt"
)func main() {// 1. 直接创建,创建后赋值var person1 utils.Person // 创建结构体实例person1.Name = "李华"person1.Age = 30person1.Sex = "女"fmt.Println("Person 1:", person1)// 2. 创建时赋值属性// 2.1 不指定字段,但按顺序赋值person2 := utils.Person{"王伟", 25, "男"}fmt.Println("Person 2:", person2)// 2.2 不按顺序,但指定字段赋值person3 := utils.Person{Age: 28, Name: "张敏", Sex: "女"}fmt.Println("Person 3:", person3)// 3. 创建指针后赋值// 3.1 用 & 创建指针person4 := &utils.Person{} // 创建结构体指针person4.Name = "李四"person4.Age = 30person4.Sex = "男"fmt.Println("Person 4:", *person4) // 解引用打印// 3.2 用 & 创建指针,同时赋值person5 := &utils.Person{Name: "王五", Age: 25, Sex: "女"}fmt.Println("Person 5:", *person5) // 解引用打印// 3.3 用 new 创建指针person6 := new(utils.Person) // 使用 new 创建指针person6.Name = "陈刚"person6.Age = 26person6.Sex = "男"fmt.Println("Person 6:", *person6) // 解引用打印
}

注意:go编译器会自动处理结构体指针,使结构体的访问和不使用指针一样,即还是能用.访问和修改结构体指针指向的内容,这点到方法那里还有应用。
一些细节:
1.结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)。
2.结构体进行 type 重新定义(相当于取别名),go认为是新的数据类型,但是相互间可以强转。
示例如下:

package mainimport ("course/chap10oop/utils""fmt"
)// 定义另一个结构体,字段完全相同
type person2 struct {Name stringAge  intSex  string
}// 定义一个结构体,作为类型别名
type person3 utils.Personfunc main() {// 【1】结构体是用户单独定义的类型,和其它类型进行转换时//需要有完全相同的字段(名字、个数和类型)p1 := utils.Person{Name: "李华", Age: 30}p2 := person2{Name: "王伟", Age: 25}fmt.Println("person2:", p2)// 将 Person 转换为 person2,字段完全相同p2 = person2(p1) // 强制转换fmt.Println("person2:", p2)// 尝试将 person2 转换为 Person,字段完全相同p1 = utils.Person(p2) // 强制转换fmt.Println("Person:", p1)// 【2】结构体进行 type 重新定义(相当于取别名),go 认为是//新的数据类型,但是相互间可以强转p3 := person3{Name: "张敏", Age: 22}// Person3 和 Person 之间可以强转p4 := utils.Person(p3) // 强制转换fmt.Println("Converted Person:", p4)// 直接使用别名fmt.Println("person3:", p3)
}

http://www.ppmy.cn/news/1533873.html

相关文章

分布式选举 - Paxos、Zab 和 Raft 选举协议的逐步优化与对比分析

在分布式系统中,选举协议的设计是确保一致性与高可用性的核心。Paxos、Zab 和 Raft 作为分布式一致性协议的代表,展示了协议优化的逐步过程。从 Paxos 到 Zab,再到 Raft,每个协议都对前者的复杂性和效率进行了改进。本文将通过对比…

docker kibana 连接es

server.name: kibana server.host: “0” #容器中配置,去掉http://127.0.0.1:9200 elasticsearch.hosts: [“http://host.docker.internal:9200”] #设置访问用户 elasticsearch.username: “elastic” #设置访问密码 elasticsearch.password: “elastic” #设置中文…

TCP/UDP初识

TCP是面向连接的、可靠的、基于字节流的传输层协议。 面向连接:一定是一对一连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端…

汽车发动机系统(ems)详细解析

汽车发动机系统EMS,即Engine-Management-System(发动机管理系统),是现代汽车电子控制技术的重要组成部分。以下是对汽车发动机系统EMS的详细解析,内容将涵盖其定义、工作原理、主要组成、功能特点、技术发展以及市场应…

《Linux从小白到高手》理论篇(五):文件权限控制及文件操作相关的命令

本篇介绍Linux文件权限控制及文件操作相关的命令,看完本文,有关Linux文件权限控制及文件操作相关的常用命令你就掌握了99%了。 文件权限 在介绍文件权限之前先来复习下Linux的文件类型,始终记住那句话:Linux系统下,一…

基于Hive和Hadoop的用电量分析系统

本项目是一个基于大数据技术的用电量分析系统,旨在为用户提供全面的电力消耗信息和深入的用电量分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…

计网问答大题(期末复习)

计网总结笔记 概述 互联网的 2 个重要基本特点:连通性,资源共享 从互联网的工作方式上看,可以划分为两大块: •边缘部分: 由所有连接在互联网上的主机组成,由用户直接使用,用来进行通信&…

Word:表格公式计算

一、求和公式 以下演示是在windows操作系统环境,office软件进行操作的 SUM(LEFT) 全部步骤图如下: 步骤一 光标置于单元格,依次单击【表格工具-布局】→【数据】→【公式】 步骤二 在【公式】一栏中,默认的是“SUM(LEFT)”求和…