热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang中的面向对象编程之一

golang中的面向对象编程之一,Go语言社区,Golang程序员人脉社

1、golang中面向对象编程说明

在这里插入图片描述在这里插入图片描述

2、结构体与结构体变量(实例/对象)的关系示意图

在这里插入图片描述
2.1、定义一个Cat结构体体验一把

//定义一个cat结构体,将cat的特性作为字段属性,放到结构体中 type Cat struct { Name string Age int Color string Hobby string } func main() { //1、初步体验 // 创建一个Cat的变量 var cat1 Cat cat1.Name = "baicai" cat1.Age = 18 cat1.Color = "白中透绿" fmt.Println(cat1) }

2.2、结构体和结构体变量(实例)的区别
在这里插入图片描述
2.3、结构体变量在内存中的布局
在这里插入图片描述
2.4、结构体内字段(变量)的声明与类型
在这里插入图片描述

2.5、结构体声明的几种方式
方式一:var cat Cat

方式二:cat :=Cat{值}

方式三:var cat *Cat=new (Cat) 指针类型

方式四:var cat *Cat =&Cat{}
说明:
在这里插入图片描述
码:

//定义一个cat结构体,将cat的特性作为字段属性,放到结构体中 type Cat struct { Name string Age int Color string Hobby string } func main() { //1、初步体验 // 声明一个Cat的变量 var cat1 Cat cat1.Name = "baicai" cat1.Age = 5 cat1.Color = "白中透绿" fmt.Println("猫1:", cat1) //声明时初始化 类似使用构造函数初始化 cat3 := Cat{"tudo", 3, "黑","吃"} fmt.Println("cat3",cat3) //声明结构体指针 var cartPointer *Cat = new(Cat) (*cartPointer).Name = "cabbage" cartPointer.Age = 6 cartPointer.Color = "白中透绿" fmt.Println("猫2:", *cartPointer) }

2.6、struc类型的内存分配机制
结构体属于基本数据类型,直接赋值属于值传递,会开辟新的内存,两者独立
在这里插入图片描述
在这里插入图片描述
2.7、结构体使用注意事项和细节
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例:

//给struct的每个字段上写一个tag,该tag可以通过反射机制获取,常见的应用场景就是序列化和反序列化 func main(){ dog := Dog{"guai", 12} jsonStr, err := json.Marshal(dog) if err != nil { fmt.Println("json处理错误:", err) } else { fmt.Println("jsonStr:", string(jsonStr)) } } type Dog struct { Name string `json:"name"` Age int `json:"age"` }

结果:
在这里插入图片描述

3、方法

3.1、为结构体绑定方法
在这里插入图片描述2)
3.2、方法的声明(定义)
在这里插入图片描述
}
在这里插入图片描述例:

func main(){ //方法: //基本介绍,在某些情况下。我们需要声明方法,如Person结构体中处理有一些字段外, //还应该有一些行为,如:可以说话,跑步,等。在golang中的方法是作用在指定的数据类型上的 //即:和指定的数据类型绑定,因此自定义类型都可以有方法,而不仅仅是struct a := A{12} a.test() } type A struct { Num int } func (a A) test() { fmt.Println("方法测试:", a.Num) }

注意:
1)test方法和A类型绑定
2)test方法只能通过A类型的变量来调用,而不能直接调用,也不能用其它类型变量来调用
3)func (A a)test(){} …a表示那个A类型的变量调用,这个a就是它的副本,这点和函数传参相似。

3.3、为非struct类型的自定义类型绑定方法

// 为非struct类型的自定义类型绑定方法 func main(){ var aa myFuncType1 aa = 12 aa.test() } //自定义类型并绑定函数 实际上这只是相当于给int类型起个别名 这里主要用来演示为自定义类型bang'ding函数调用 type myFuncType1 int func (mytype myFuncType1) test() { fmt.Println("自定义类型的函数调用:", mytype) }

3.4、方法调用和传参机制原理
方法的调用和传参机制和函数基本一样(这里的方法指与自定义类型绑定的方法,而函数一般是单独的不与自定义类型绑定),不一样的地方是,方法调用时,会将调用方法的变量,当作形+
参传递给方法。
在这里插入图片描述
例:

func main(){ c := Cricle{4.0} area := c.area() fmt.Println("半径为:", c.randius, "的原面积为:", area) } type Cricle struct { randius float64 } //将方法绑定到Circle结构体上 func (cricle Cricle) area() float64 { return 3.14 * cricle.randius * cricle.randius }

在这里插入图片描述
3.5、
在这里插入图片描述
练习1:

func(){ //测试利用结构体并为结构体绑定方法来求圆面积 c := Cricle{4.0} area := c.area() fmt.Println("半径为:", c.randius, "的原面积为:", area) //3.3、练习,编写一个方法计算矩形的面积并将计算结果保存到结构体中 rec := Rectangle{4.0, 5.0, 0.0} rec.GetArea() fmt.Printf("矩形的长为%f宽为:%f,面积为:%f", rec.Len, rec.Width, rec.Area) } type Rectangle struct { Len float64 Width float64 Area float64 } //求面积 func (rec *Rectangle) GetArea() { rec.Area = rec.Len * rec.Width }

练习二:

//定义小计算器结构体(Calcuator),实现加减乘除四个功能 cal:=Calcuator{4.0,5.0} fmt.Println("计算机 两数和:",cal.getRes('+')) } type Calcuator struct{ Num1 float64 Num2 float64 } func (cal Calcuator) getRes(operator byte)float64{ res:=0.0 switch operator { case '+': return cal.Num1+cal.Num2 case '-': return cal.Num1-cal.Num2 case '/': return cal.Num1/cal.Num2 case '*': return cal.Num1*cal.Num2 default: fmt.Println("运输算出错") } return res }

4、面向对象编程应用实例

根据游客年龄展示票价

func main(){ visitor :=Visitor{"guai",22} //调用结构体绑定的方法 visitor.showPrice() } //定义结构体 type Visitor struct { Name string Age int } //为结构体绑定方法 func (visitor *Visitor)showPrice(){ if visitor.Age>=90||visitor.Age<=8{ fmt.Println("为了你的安全,你还是不要玩了") return } if visitor.Age>18{ fmt.Println("名字为:",visitor.Name,"的游客年龄为",visitor.Age,"收费为20元") }else{ fmt.Println("名字为:",visitor.Name,"的游客年龄为",visitor.Age,"收费为40元") } }

部分图片来自 Go语言-尚硅谷_韩顺平_Go语言核心编程.pdf如需我删除,可以留言或者私聊哟
磕头ing


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
author-avatar
JohnBeanLee
A PHP Coder
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有