2021/8/12 老男孩带你21周搞定Go语言 (三)
P44 概要
P45 回顾
函数当成参数传进去,这个函数类型是接收string类型参数的函数
函数内部无法申明带名字的函数
这就是它的类型
闭包有特殊场景,A开发了函数,这个函数需要传函数变量,类似下面的
比如把函数传到low里,但是现在是类型不匹配的,因为yuanshuai函数要接收一个string参数
包一下传到low里
bi的返回值是个函数,fc这个函数,没有参数没有返回值给了low,这样就实现,本来元帅不能传给low,利用bi包一下传给了low
defer是延迟调用,多用于处理资源的释放
panic是抛出让程序崩溃的错误的,但是如果占用了一些资源没释放,就需要recover尝试恢复,做一些资源的释放
defer延迟调用,f1即将return的时候才执行,到了panic要退出了,执行defer,调用recover,把错误收拾收拾,打印“松手去爱”,打印err,f1就结束了,实现友好退出,然后执行f2
P46 分金币
main函数一般放一些最简单的代码
map需要make做初始化,slice也需要.
需要先遍历人民,把每个字母取出来,’'单引号代表字符,根据条件加金币
金币要减少
需要return一个金币数
这就是一个map
P47 递归
说白了就是函数调用自己,比如打开一个文件夹,进入,再打开里面的文件夹,进入,再打开
递归一定要确定退出条件,不然是死循环,递归适合处理问题相同,规模越来越小的场景
其实就是走到最后,剩1个台阶有几种走法,剩2个台阶有几种走法,两个加起来就是总的种
P48 自定义类型和类型别名
go语言是强类型,但是可以基于基本类型创建新的类型
自定义类型有时候会用到,
type myint int是自定义类型,带=是类型别名
中的字符编码是20013,rune是int32的类型别名
类型别名,是为了让写代码的时候,更加清晰知道代码是做什么用的
rune是int32的别名
区别是,自定义类型在编译完后还是自定义类型,但如果是类型别名就还是原来的类型。
P49 结构体初识
比如一个人有很多维度的信息,身高,体重,就需要自定义这样一个类型
结构体会把每个变量对应的值依次打印出来
类型的分类是i结构体,类型是person
结构体是为了表示多维度的个体
某个变量不赋值的时候就是0值,string的0值就是空字符串,切片就是空的slice
P50 匿名结构体
在一个包里,定义的类型名是不能重复的。
字段名必须唯一。
字段类型:结构体字段的类型
匿名结构体适合临时使用
结构体是值类型的,就是ctrl c 和ctrl v
P51 结构体指针和结构体初始化
go里的传参全是ctrl c和ctrl v的,改的也是副本,要想改原来的,只能传内存 地址,指针
x 设定为person的指针,&p 内存地址
根据内存地址找到原变量,修改的就是原来的变量,函数内部修改变量,就要使用指针了
go语言有语法糖,go里是不允许修改指针,x会去自己判断,然后去修改指针对应的变量
new(int string bool )和make都是用来申请内存的,new返回的是对应类型的指针。
make是用来给特定类型开辟内存的,slice,map,channel,返回的就是对应类型。
var p2 =new(person) 返回的p2就是对应类型的指针
指针类型的值表示的是一个内存 地址
%p 拿的是变量的指针
一个是int类型,一个是int类型指针
&a 把a的内存地址取出来,%p可以打印出来16进制的格式,b也是等于a的内存地址,但是这里打印的b其实是b的值,b的内存地址并不一样
p2 是一个person类型的指针,&p2这样才是p2变量的地址
p2保存到值就是一个内存 地址,本身作为变量,也有一个内存 地址
*p2.name其实是语法糖,其实是(p2)
声明变量类型,并同时初始化,key 和value做初始化
列表初始化,考虑 到值的顺序
结构体初始化有两种方式,值和列表的方式,一种是列表的方式,&取指针
结构体里的字段其实是连在一起的,一个结构体占用的内存是一块连续的内存
取一下内存地址
c字段类型和上面不一样,为了查的更快,有一个内存对齐,所以不是421而是428
类型一样,就是连续下去,没有用到内存对齐
P52 结构体和初始化
可以模拟其他语言,构造函数返回一个结构体变量的函数,go语言可以面向对象,但是理念是面向接口编程
直接定义的结构体都是var声明的
这样的好处就是想要拿到一个结构体,直接调用这个函数就可以了。
现在就是使用一个构造函数去新建一个person变量
**当结构体比较小,直接拷贝,消耗不大,可以用person,如果结构体比较大,尽量返回使用指针类型,指针始终是一个int64这样一个值。
也就是结构体比较大的时候尽量 使用结构体指针,减少程序的内存开销。
go语言的构造函数,约定是new开头
**
新造一个dog函数
构造函数用new开头,变量是什么类型,就是返回什么类型,dog,就返回dog类型,或者dog指针。
注意结构体大小,什么时候用指针,什么时候用值
P53 方法和接收者
方法其实一种函数,是特殊的函数,作用于特定的变量
方法是作用于特定类型的函数,dog是类型,d代表形参,表示dog类型
d是个接收者,一般用变量的首字母,多用类型名首字母小写表示,类似pthon的self,前端的this
构造函数是一个,方法是一个
P54 值接收者和指针接收者的区别
标识符:变量名,函数名,类型名,方法名,这些首字母大写,表示对外部可见,也就是公有的,就比如fmt包里,Print一定是大写,不然在外部无法访问调用
记得要写注释
方法多了,接收者,参数,返回值
要申明方法就必须指定接收者,接收者就是一个具体的类型
接收者分为指针接收者和值接收者
接收者为值类型,传过来的时候把p1拷贝了一份给p,所以修改的不是一个age,就还是打印18
要想修改原来的age,就需要用到接收者为指针类型
两者的接收者不一样
什么时候需要用到指针类型的接收者
1.需要修改接收者的值的时候。
2.接收者是拷贝代价比较大的对象,结构体消耗比较大
3.保持一致性,别的方法用了指针接收者,那其他的方法也应该使用
比如给int类型加一个hello方法,自己创个类型为myint,间接给int类型造了一个hello方法。
不能给其他包里面的 类型添加方法,只能在自己的包里的类型添加方法
P55 那些你遇到的问题
go默认声明是int,现在是int32
三种声明int32类型的变量
声明一个myint变量m,值是 100
问题2:结构体初始化
声明这个变量的时候同时完成初始化
一个是键值对,一个是值列表
问题3:为什么要有构造函数
别人调用自己,自己给它一个person类型的变量
P56 函数版学生管理系统
**1.登录系统打印菜单
2.等待用户选择要做什么
3.执行打印对应的函数
**
扫描用户的输入
获取输入,选择执行什么
定义功能函数
实现上面的三个函数,
student的类型变量地址,student需要做初始化
把所有学生打印
add学生,创建一个学生,追加到allstudent这个map里
造学生需要一个构造函数,返回指针
删除学生,输入学生号,删除对应的键值对
P57 结构体的匿名字段结构体嵌套等
匿名字段就是没有名字的字段
匿名字段不是很常用
把另外一个结构体嵌套在自己内部
造一个person类型的变量
拿到姓名和居住的城市
匿名嵌套,就是嵌套的时候没有名字
匿名其实就是这样写的
匿名的好处就是可以直接p1.city,省略了中间的address,访问字段方便一点
但是两个嵌套进去了,有同名的字段,p1.city查找city这个字段是现在自己的结构体里找,找不到就去匿名嵌套的结构体里去找,现在这样的情况,就只能写全调用的字段了
P58 结构体模拟实现继承
结构体模拟实现其他语言里的继承
d.name查找的时候会去找结构体的再去找匿名的
dog结构体把animal结构体包起来了,animal有的方法,dog也有,变相实现了继承
P59 结构体和JSON
json是最先在js里表现对象的一种模式
把go里结构体转程json,json转成go里的结构体
是一个字符串,只不过就一个{}
因为小写开头, 别的作用域就拿不到这个变量
为什么要大写,其实是在json报里的marshal方法里,把你p1的变量拿出来,所以要大写,小写拿不到变量
** 如果想要指定json解析的时候,变成什么字段,可以在后面加json:xxx `反引号 **
这是一个序列化的过程,marshal,反序列化unmarshal,如果要在函数里修改,就必须传指针&,因为go里面传变量都是值拷贝
P60 结构体内容回顾01
上面声明一个结构体,下面给初始值
匿名结构体
结构体声明了就需要使用,结构体需要使用{},两种不同方式的实例化
构造函数实际上也需要new person这样的操作
转变一下就成了这样,构造函数就是构造结构体变量的函数
三种方式,哪种方便用哪种
int是返回值的类型
其实就是一个普通的函数
P61 结构体内容回顾02
方法其实就是有接收者的函数,接收者指的是哪个类型的变量可以调用这个函数,接收使用对应首字母小写。指定了接收者后,只有接收者这个类型的变量才能调用这个方法。
如果想要每个person的梦想不一样,可以加参数
这样方法就可以像函数一样传参数了
方法其实就是函数,只不过在函数前加一个接收者这样的概念
结构体是值类型(区别是引用类型,引用类型存的是内存地址,值类型是拷贝,ctrl +c /v),接收者也可以是指针
对guonian进行调用,但是其实上面改的是一个副本
person类型的指针
相当于&p1.guonian
当需要在方法里去修改结构体变量值的时候,需要用指针接收者,
2.还有当结构体比较大的时候
3.保持一致性,一个方法使用了指针接收者,那么其他方法也需要
结构体里可以嵌套另一个结构体
匿名嵌套
json序列化和反序列化的注意点:
1.结构体内部要大写,不大写别人是访问不到。
2.反序列化:由字符串–》go中的结构体变量,反序列化传的需要是指针。
byte类型的切片,就是个字符。ascii码能表示的就是byte,error是错误类型
go语言的一般把错误当作第二个返回值
返回空时因为x和y都是小写的
改成大写
假如就想要显示json的时候是小写
上面的是序列化,下面是反序列化,就是把字符串转成go的结构体变量。
这里其实是错误的,这里修改的其实是副本,打印po2就还是原来的。
传一个指针进去
区别:自定义类型编译完之后还是存在的,类型别名只是在代码编写过程中存在的,编译后就不存在
P62 结构体版学生管理系统
修改main入口,但是run的时候要把两个文件都写进去
需要等待用户输入
初始化一个所有学生结构体
基本架子
拿到map可以遍历
增加学生,并把新的学生 放到map里
就可以看到有一个学生添加进去了
修改学生
有没有这个用户就返回key或false
修改学生函数
要对对象进行一个更新
删除学生
使用了结构体和结构体的方法
2021/8/12 老男孩带你21周搞定Go语言 (三)相关推荐
- 2021/07/11 老男孩带你21周搞定Go语言 (二)
P30 回顾,运算符和数组 var [30]int 长度30 int类型的数组 [30]int就代表类型 声明变量做初始化 [-]代表用后面的初始化,让go主机去数长度 数组遍历两种方式,一种是长度, ...
- 2021/8/28 老男孩带你21周搞定Go语言 (四)
P63 今日内容 P64 初识接口类型 接口是一种类型,结构体也是一种类型,区别其他基本类型,可以展示多维度的数据 da谁就会speak,但是这样写就限定了dog类型,cat就传不进去了 go语言里不 ...
- 2021/07/11 老男孩带你21周搞定Go语言 (一)
P1 为什么要学习go go语言设计之初就考虑到多核CPU了,编译好执行,有几个核就跑满几个核 etcd代替zookeeper P2 课上所有物料介绍 typora的笔记里偏好设置,图片到当前的.as ...
- 2022/01/10 老男孩带你21周Go语言 (十四)
P202 raft选主实现 候选人遇到 3种情况会结束: 1.当选leadr 2.其他服务器成为leader 3.卡死 go实现raft选举,raft可以定义一个结构体,根据结构体写代码 1.使用代码 ...
- 9月29日云栖精选夜读 | 17个案例带你3分钟搞定Linux正则表达式
正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类: Shell元字符,由Linux Shell进行解析: 正则表达式元字符,由vi/grep/sed/awk ...
- 【一周搞定计算机网络】计算机网络第5章(运输层)
[一周搞定计算机网络]文章全系列已经更新完毕,详情请戳: 计算机网络第1章(概述) 计算机网络第2章(物理层) 计算机网络第3章(数据链路层) 计算机网络第4章(网络层) 计算机网络第5章(运输层) ...
- 2021年12月20日|21日|22日|23日|24日
2021年12月第四周周记 回顾排序算法 选择排序 索引i自左向右 记录有序下边界的下一个数,遍历 i+1 →arr.length 取其中最小值与i交换 有序下边界向右扩 ++ 冒泡排序 索引i自右向 ...
- 清华大作业指导:一人单刷雨课堂需要多少工作量?快手工程师详解如何两周搞定...
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心 昨天,清华自动化大一学生的 C++大作业霸占了 ...
- 轻松搞定c++语言pdf_当年锤子的大爆炸,如今12个语言版本都可轻松搞定!
第011期原创分享 作者:huber 大家好,我是Hub哥!又被Hub友们催更了. 这些天,刷抖音看到罗永浩老师的直播带货,发现了老罗的一些变化,头发少了几千根啊(瞎猜的),言行举止少了往日怼天怼地的 ...
最新文章
- 爬虫之利用requests.session进行状态保持
- JDBC: Java连接MySQL
- [SCOI2007] 修车(费用流 + 差分时间段建图)
- java动脑公开课_java课堂动手动脑
- “约见”面试官系列之常见面试题之第四十七篇之前端页面的组成(建议收藏)
- Pytorch 为什么每一轮batch需要设置optimizer.zero_grad
- 【Angular专题】——(2)【译】Angular中的ForwardRef
- window 下的mysql_Window下mysql的安装
- 关于runc漏洞CVE-2019-5736的修复公告 1
- 基于kali linux 跑字典暴力破解wifi教程
- 手机号段归属地数据库
- Raspberry 4B 2G Shairport-sync Airplay
- 有哪些盛极一时的互联网产品,现在都没落了?
- 机器人守则悖论_第一节:机器人三定律的悖论
- 谷歌推出 Translatotron 2,一种没有深度伪造潜力的语音到语音直接翻译神经模型
- 【回溯】B043_LQ_36进制 瓷砖样式(暴搜+策略)
- HZNUOJ 2058 凯撒密码
- 学生信息管理系统 C++实现
- Python数据标准化处理
- 小米pro 笔记本 计算机,【MI/小米笔记本 Pro超极本】MI 小米 笔记本 Pro 15.6英寸 笔记本电脑【报价 价格 评测 怎么样】 -什么值得买...