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语言 (三)相关推荐

  1. 2021/07/11 老男孩带你21周搞定Go语言 (二)

    P30 回顾,运算符和数组 var [30]int 长度30 int类型的数组 [30]int就代表类型 声明变量做初始化 [-]代表用后面的初始化,让go主机去数长度 数组遍历两种方式,一种是长度, ...

  2. 2021/8/28 老男孩带你21周搞定Go语言 (四)

    P63 今日内容 P64 初识接口类型 接口是一种类型,结构体也是一种类型,区别其他基本类型,可以展示多维度的数据 da谁就会speak,但是这样写就限定了dog类型,cat就传不进去了 go语言里不 ...

  3. 2021/07/11 老男孩带你21周搞定Go语言 (一)

    P1 为什么要学习go go语言设计之初就考虑到多核CPU了,编译好执行,有几个核就跑满几个核 etcd代替zookeeper P2 课上所有物料介绍 typora的笔记里偏好设置,图片到当前的.as ...

  4. 2022/01/10 老男孩带你21周Go语言 (十四)

    P202 raft选主实现 候选人遇到 3种情况会结束: 1.当选leadr 2.其他服务器成为leader 3.卡死 go实现raft选举,raft可以定义一个结构体,根据结构体写代码 1.使用代码 ...

  5. 9月29日云栖精选夜读 | 17个案例带你3分钟搞定Linux正则表达式

    正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类: Shell元字符,由Linux Shell进行解析: 正则表达式元字符,由vi/grep/sed/awk ...

  6. 【一周搞定计算机网络】计算机网络第5章(运输层)

    [一周搞定计算机网络]文章全系列已经更新完毕,详情请戳: 计算机网络第1章(概述) 计算机网络第2章(物理层) 计算机网络第3章(数据链路层) 计算机网络第4章(网络层) 计算机网络第5章(运输层) ...

  7. 2021年12月20日|21日|22日|23日|24日

    2021年12月第四周周记 回顾排序算法 选择排序 索引i自左向右 记录有序下边界的下一个数,遍历 i+1 →arr.length 取其中最小值与i交换 有序下边界向右扩 ++ 冒泡排序 索引i自右向 ...

  8. 清华大作业指导:一人单刷雨课堂需要多少工作量?快手工程师详解如何两周搞定...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心 昨天,清华自动化大一学生的 C++大作业霸占了 ...

  9. 轻松搞定c++语言pdf_当年锤子的大爆炸,如今12个语言版本都可轻松搞定!

    第011期原创分享 作者:huber 大家好,我是Hub哥!又被Hub友们催更了. 这些天,刷抖音看到罗永浩老师的直播带货,发现了老罗的一些变化,头发少了几千根啊(瞎猜的),言行举止少了往日怼天怼地的 ...

最新文章

  1. 爬虫之利用requests.session进行状态保持
  2. JDBC: Java连接MySQL
  3. [SCOI2007] 修车(费用流 + 差分时间段建图)
  4. java动脑公开课_java课堂动手动脑
  5. “约见”面试官系列之常见面试题之第四十七篇之前端页面的组成(建议收藏)
  6. Pytorch 为什么每一轮batch需要设置optimizer.zero_grad
  7. 【Angular专题】——(2)【译】Angular中的ForwardRef
  8. window 下的mysql_Window下mysql的安装
  9. 关于runc漏洞CVE-2019-5736的修复公告 1
  10. 基于kali linux 跑字典暴力破解wifi教程
  11. 手机号段归属地数据库
  12. Raspberry 4B 2G Shairport-sync Airplay
  13. 有哪些盛极一时的互联网产品,现在都没落了?
  14. 机器人守则悖论_第一节:机器人三定律的悖论
  15. 谷歌推出 Translatotron 2,一种没有深度伪造潜力的语音到语音直接翻译神经模型
  16. 【回溯】B043_LQ_36进制 瓷砖样式(暴搜+策略)
  17. HZNUOJ 2058 凯撒密码
  18. 学生信息管理系统 C++实现
  19. Python数据标准化处理
  20. 小米pro 笔记本 计算机,【MI/小米笔记本 Pro超极本】MI 小米 笔记本 Pro 15.6英寸 笔记本电脑【报价 价格 评测 怎么样】 -什么值得买...

热门文章

  1. [附源码]计算机毕业设计JAVA企业记账系统
  2. 多屏幕刷新率(refresh rate)模式下的帧显示流水线
  3. Win11任务栏太宽了怎么变窄?Win11任务栏宽度调整方法
  4. java时钟日历_java日历时钟小程序
  5. 【论文分享】通过图神经网络明确捕捉实体提及的关系,用于特定领域的命名实体识别
  6. 高频交易到底要多强数学功力?
  7. 移动端不同分辨率手机的适配问题
  8. python操作postgresql
  9. 红米Note4X 刷机LineageOs 14.1全过程讲解
  10. FlatList使用示例包含RefreshControl