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

在这里插入图片描述

在这里插入图片描述
修改学生函数
在这里插入图片描述

在这里插入图片描述
要对对象进行一个更新

在这里插入图片描述
删除学生
在这里插入图片描述
使用了结构体和结构体的方法

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值