Golang学习之路5-结构体/类封装等使用

news2024/12/23 17:53:22

文章目录

  • 前言
  • 一、结构体
    • 1.声明结构体
    • 2.匿名结构体
  • 二、类
    • 1.封装及绑定
    • 2.继承
    • 3.多态及接口
    • 4.类访问权限
  • 总结


前言

go语言支持类的操作,但是没有class关键字,使用struct来模拟类、结构体。类支持封装、绑定方法、继承等


一、结构体

结构体是由零个或多个任意类型的值聚合成的实体,它可以用于将数据分组为一个单元而不是将它们中的每一个作为单独的值。

1.声明结构体

用关键字 type 和 struct 用来定义结构体。

type StructName struct{
    FieldName type
}

2.匿名结构体

以在不创建新数据类型的情况下声明结构,直接给予变量赋值。

func main() {
	ppl := struct {
		name   string
		age    int
		gender string
		score  float64
	}{}
	fmt.Println(ppl.name)
	ppl.name = "ppl"
	fmt.Println(ppl.name)
}

完整代码

package main

import "fmt"

type Student struct {
	// 定义结构体
	name   string
	age    int
	gender string
	score  float64
}

func main() {
	// 所有字段都写完整值value,可不写key
	ppl := Student{
		"ppl",
		18,
		"男",
		60.5, // 最后一字段写上逗号,不然花括号}要同一行
	}
	// 修改值
	ppl.name = "我的新名字哈哈哈"
	fmt.Println(ppl)
	// 部分字段有值时,需要写上:key:value,无值的默认为空值
	ppl1 := Student{
		name:  "PPL",
		score: 060.6,
	}
	fmt.Println(ppl1, "age:", ppl1.age, " gender:", ppl1.gender)
	prt := &ppl1 // 指针
	fmt.Println(prt.name)
	fmt.Println((*prt).name)

	// 匿名结构体
	ppl2 := struct {
		name   string
		age    int
		gender string
		score  float64
	}{}
	fmt.Println(ppl2.name)
	ppl2.name = "ppl"
	fmt.Println(ppl2.name)
}

在这里插入图片描述


二、类

1.封装及绑定

如下结构体模拟类,有着属性,绑定了Eat方法

type Person struct {
	// 成员属性
	name   string
	age    int
	gender string
	score  float64
}

// 类绑定方法,绑定后可使用成员属性
func (p Person) Eat() {
	p.name = "gsxl"
	fmt.Println("不使用指针 Eat func 修改为:", p.name)
}

注意使用指针时及不使用指针时的区别:

  • 不使用指针修改:只会改变当前成员属性,原始属性不会改变
  • 使用指针修改,原始属性也跟着改变

完整代码

package main

import "fmt"

type Person struct {
	// 成员属性
	name   string
	age    int
	gender string
	score  float64
}

// 类绑定方法,绑定后可使用成员属性
func (p Person) Eat() {
	p.name = "gsxl"
	fmt.Println("不使用指针 Eat func 修改为:", p.name)
}

func (p *Person) Work() {
	p.name = "广深小龙"
	fmt.Println("使用指针 Work func 修改为:", p.name)
}

func main() {
	ppl := Person{
		name:   "ppl",
		age:    18,
		gender: "男",
		score:  66.23,
	}
	// 不使用指针修改:只会改变当前成员属性,原始属性不会改变
	ppl.Eat()
	fmt.Println(ppl.name)

	// 使用指针修改,原始属性也跟着改变
	ppl.Work()
	fmt.Println(ppl.name)
}

在这里插入图片描述

2.继承

1、类的继承,直接写超类名称

type Human struct {
	// 超类/父类
	name   string
	age    int
	gender string
}

type Teacher struct {
	Human // 继承,直接写超类
	school string
	gender int
}

2、如果是这样不算是继承,是嵌套

type Human struct {
	// 超类/父类
	name   string
	age    int
	gender string
}

type Teacher struct {
	h      Human // 继承,直接写超类
	school string
	gender int
}

完整代码

package main

import "fmt"

type Human struct {
	// 超类/父类
	name   string
	age    int
	gender string
}

func (h *Human) Eat() {
	fmt.Println("Eat func:", h.name)
}

type Student1 struct {
	// 并非继承,只是嵌套类
	h      Human
	school string
}

type Teacher struct {
	Human // 继承,直接写超类
	school string
	gender int
}

func main() {
	s := Student1{
		h: Human{
			name:   "ppl",
			age:    25,
			gender: "男",
		},
		school: "广西大学",
	}
	s.h.Eat() // 嵌套调用

	t := Teacher{}
	t.name = "漂漂亮"
	fmt.Println(t.name)
	t.Eat() // 继承调用,我们在Teacher并没有创建Eat方法,但是被继承了默认创建了同名方法及属性

	// 定义了相同的属性,只能调用自己的,如果想调用父类那么需要.父类.属性
	fmt.Println("子类的gender:", t.gender)
	fmt.Println("父类的gender:", t.Human.gender)
}

在这里插入图片描述

3.多态及接口

在学习多态前我们先了解下接口interface,支持任何类型。
1、interface
接口类型是一种抽象类型。通常用来接收任何类型参数,如下:

/*
	1.关键字定义接口:interface
	2.interface接收任意数据类型
*/
func checkType(values ...interface{}) {
	for _, value := range values {
		switch v := value.(type) {
		case string:
			fmt.Println("this type is string:", v)
		case int:
			fmt.Println("this type is int:", v)
		case bool:
			fmt.Println("this type is bool:", v)
		default:
			fmt.Println("this type is default:", v)
		}
	}
}

在这里插入图片描述
2、多态
多态可以理解:传入不同对象,调用相同方法,实现不同效果。
下面举个例子:猫、狗都属于动物都需要吃食物,那么接口中都调用了Eat(),猫与狗都有Eat()的方法,只是食物不一样,那么根据不同对象进行对应的Eat()。

package main
import "fmt"
/*
多态:传入不同对象,调用相同方法,实现不同效果
1.定义一个接口,设计好需要调用接口,可多个
2.任何实现了此接口,都可赋值,从而实现多态
*/

type Animal interface {
	// 定义一个接口,接口可以多个函数,不可有实现
	Eat()
}

type Dog struct {
	name string
	eat  string
}

type Cat struct {
	name string
	eat  string
}

func (d *Dog) Eat() {
	fmt.Println("this is Dog eat", d.eat)
}

func (c *Cat) Eat() {
	fmt.Println("this is Cat eat", c.eat)
}

func main() {
	// 定义一个接口类变量
	var eat Animal
	
	// 动物狗
	dog := Dog{
		name: "小狗钱钱",
		eat:  "狗粮",
	}
	eat = &dog
	eat.Eat()

	// 动物猫
	cat := Cat{
		name: "招财猫",
		eat:  "猫粮",
	}
	eat = &cat
	eat.Eat()
}

在这里插入图片描述

4.类访问权限

go语言中都是遵循以下规则:

  • pubic:首字母大写 (对内外均可调用)
  • private:首字母小写 (仅对内调用,不可被非自己包下调用)

总结

怎么看着结构体就是类,类就是结构体?如果你也有这种疑问那是很正常吧,因为前言说了使用结构体模拟类,实现了类的三大特点。
End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++进阶】map和set( 万字详解)—— 上篇

🎇C学习历程:进阶 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…

青少年python系列 42.面向对象-继承

青少年python系列目录_老程序员115的博客-CSDN博客 青少年python教学视频ppt源码 继承?继承啥?提起继承这两个字,最先能够联想到的应该就是子继父业这个成语。还记得之前在我们的课程中提及过,在面向对象编程时,是可以…

【Linux】关于进程的理解、状态、优先级和进程切换

文章目录📝一、操作系统进程1.运行队列2.运行状态📝二、Linux进程状态📝三、两个特殊进程1.僵尸进程2.孤儿进程📝四、进程优先级1.优先级概念2.查看系统进程3.PRI和NI4.top命令更改nice5.特性📝五、进程切换1.并发2.进…

软件工程方法论

🐰作者简介:一位普通高校的在校学生,致力于提高自己的编程能力。 🍌个人主页:比昨天强一點的博客_CSDN博客-C语言从0到精通领域博主 🍍系列专栏:C语言从0到精通_比昨天强一點的博客-CSDN博客 &a…

真良心干货保姆级手把手教你Python网络编程,学不会我去你家教你

Python网络编程基本概念(计算机网络基础)IP地址与端口IP地址端口网络通信协议网络通信协议网络协议的分层TCP/UDP套接字编程socket()函数介绍UDP 编程实现UDP发送数据实现UDP先发送数据再接收数据实现UDP实现多线程聊天TFTP文件下载器基本概念下载的过程python内置模块structTC…

C/C++ Qt 标准Dialog对话框组件应用

在Qt中对话框分为两种形式,一种是标准对话框,另一种则是自定义对话框,在一般开发过程中标准对话框使用是最多的了,标准对话框一般包括 QMessageBox,QInputDialog,QFileDialog 这几种,这里我将总结本人在开发过程中常用…

蓝桥杯——2022年11月第十四届蓝桥杯模拟赛第一期Java

1、二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数。 十进制整数 22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数。 请问十进制整数 2022 在二进制中是几位数? 答案…

C++学习之旅 第二章 printf与cout

目录 1.printf简介 2.printf的四种用法 2.1 printf("字符串"); 2.2 printf("输出控制符",输出参数); 2.3 printf("输出控制符1 输出控制符2 ,,,,,,,, ", 输出参数1, 输出参数2,....... ); 2.4 printf("输出控制…

化妆品展示网页设计作业 静态HTML化妆品网站 DW美妆网站模板下载 大学生简单网页作品代码 个人网页制作 学生个人网页设计作业

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

C++11【智能指针详解】

智能指针🏞️1. 为什么引入智能指针?🌁2. 智能指针的使用及原理📖2.1 RAII思想📖2.2 智能指针的原理🌠3. 常见智能指针📖3.1 auto_ptr📖3.2 unique_ptr📖3.3 shared_ptr&…

基于深度学习的宋词生成

《自然语言处理》课程报告 摘 要 宋词是一种相对于古体诗的新体诗歌之一,为宋代儒客文人智慧精华,标志宋代文学的最高成就。宋词生成属于自然语言处理领域的文本生成模块,当前文本生成领域主要包括基于语言模型的自然语言生成和使用深度学习…

RK3568平台开发系列讲解(安卓适配篇)Android 源码的 device 目录

🚀返回专栏总目录 文章目录 一、device 目录简介二、Android 产品配置各种变量沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Android 源码的 device 目录。 一、device 目录简介 Android 源码下的 device 目录是 Android 源码中对产品的描述文件夹,各…

STM32个人笔记-CAN总线通讯

笔记来源于STM32F103VET6,野火指南者,中文参考手册,HAL库开发手册和b站的野火指南者视频。观看过好多次了,但往往理解得不够全面,现记下小笔记,用来回顾。属于个人笔记。​​​​​ 大四实习那年记忆颇深…

基于Java+Springboot+Vue+elememt宠物用品商城系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取联系🍅精彩专栏推荐订阅👇&#x1f…

K线形态识别_空方尖兵

写在前面: 1. 本文中提到的“K线形态查看工具”的具体使用操作请查看该博文; 2. K线形体所处背景,诸如处在上升趋势、下降趋势、盘整等,背景内容在K线形态策略代码中没有体现; 3. 文中知识内容来自书籍《K线技术分析》…

第九章 内置模块

目录 第九章 内置模块 1.math模块 1.查看: 2.常用方法: 2.random模块 1.查看: ​2.例: 3.random(a,b) 4.random.sample(range(0,20),10) 3.os模块与os.path模块 1.作用 2.目录 3.os模块与操作系统的关系 4.路径 5.判…

自我实现tcmalloc的项目简化版本

项目介绍 该项目是基于现代多核多线程的开发环境和谷歌项目原型tcmalloc的自我实现的简化版本,相比于本身就比较优秀的malloc来说,能够略胜一筹,因为其考虑了 性能,多线程环境,锁竞争和内存碎片的问题,主要利用了池化思想来管理内存分配,对于每个线程,都有自己的私…

鸿蒙开发套件全面升级,助力鸿蒙生态蓬勃发展

目录 1. 全场景分布式系统 2. HarmonyOS的超能力:ArkTS API万箭齐发 3.解锁“鸿蒙开发套件”的新技能 (1) 智能代码编辑器 (2)Hvigor编译构建 (3)热重载:向看直播一样查看运行…

MySQL : 彻底搞懂一条SQL的执行过程

整体流程 组件介绍 连接器 处理客户端的连接,一般处理我们这个命令,判断是否满足接入server的条件 mysql ‐h host[数据库地址] ‐u root[用户] ‐p root[密码] ‐P root查询缓存 在8.0之前,如果用户开启了查询缓存的开关,那么…

vue2.6 + ts 使用vuex

目录vue2.6 ts 使用vuex安装01:直接使用 store / index.ts的数据store / index.tsmain.ts001:同步mutation操作vuex数据与获取getters001:效果002:异步action、mutation操作vuex数据002:效果02:引入其他模…