
获得徽章 0
#青训营 x 字节后端训练营#
学习一下网络:
由上到下分为4层:
应用层,由使用因特网通信来完成任务的软件单元组成,如客户机和服务器,使用FTP/SSH的软件等实用软件,HTTP,DNS,FTP
传输层,接受来自应用层的报文,确保以正确格式传输,常常切片标记,到了目的地的传输层才按标记过的顺序组装,TCP,UDP
(这是为了防止长报文阻塞其他报文流)
网络层,决定 分组(即上面切片的片段)的下一个发送方向,使用路由器的转发表来达到这一目的,选路线,IP
链路层,传送分组(实际传输),有关连接网络的硬件处理
这种传输的方式类似于现实生活中的快递,一样物品在包装过后,经过一系列中转站,最终运到买方,然后再进行拆包装,得到了最后那个原来开始的物品,才算运输完成
路由器:在链路层和网络层上
HTTPS 是在HTTP基础上加入了SSH
学习一下网络:
由上到下分为4层:
应用层,由使用因特网通信来完成任务的软件单元组成,如客户机和服务器,使用FTP/SSH的软件等实用软件,HTTP,DNS,FTP
传输层,接受来自应用层的报文,确保以正确格式传输,常常切片标记,到了目的地的传输层才按标记过的顺序组装,TCP,UDP
(这是为了防止长报文阻塞其他报文流)
网络层,决定 分组(即上面切片的片段)的下一个发送方向,使用路由器的转发表来达到这一目的,选路线,IP
链路层,传送分组(实际传输),有关连接网络的硬件处理
这种传输的方式类似于现实生活中的快递,一样物品在包装过后,经过一系列中转站,最终运到买方,然后再进行拆包装,得到了最后那个原来开始的物品,才算运输完成
路由器:在链路层和网络层上
HTTPS 是在HTTP基础上加入了SSH
展开
评论
1
#青训营 x 字节后端训练营#
今天主要了解了一下经典的排序算法,那些实际中的混合排序代码流程,以及可以优化的方面,主要需要考虑的是对快速排序算法的优化,对基准值的选取等,可以通过采样的方式来进行局部的选择优化,还去学习了快速排序算法,有很多版本,现在就了解了递归的版本,实践的测试过程中,尝试用其原理自己书写,但发现当增大切片的长度,比如由10增加到30多时,由一开始的0.34~0.4s等,到后面的甚至60s都无法出结果,并伴随着散热器的声音变大。由此可见递归的一些缺陷。
今天主要了解了一下经典的排序算法,那些实际中的混合排序代码流程,以及可以优化的方面,主要需要考虑的是对快速排序算法的优化,对基准值的选取等,可以通过采样的方式来进行局部的选择优化,还去学习了快速排序算法,有很多版本,现在就了解了递归的版本,实践的测试过程中,尝试用其原理自己书写,但发现当增大切片的长度,比如由10增加到30多时,由一开始的0.34~0.4s等,到后面的甚至60s都无法出结果,并伴随着散热器的声音变大。由此可见递归的一些缺陷。
展开
评论
点赞
#青训营 x 字节后端训练营#
今天简要看了一下database/sql的基本用法
这是一个接口,用来抽象化各种不同的数据库,使得对他们的操作一致的格式,而具体的连接就需要导入实现这个接口的包,对于mysql来说就是托管在github上的driver
调用sql.Open来连接及错误处理等一系列快速访问的模型
并学习了部分的设计原理,但没有了解具体细节,大概的就是从连接池中获取连接,直到所有连接都失败,迫不得已才选择新建一个连接。将连接放回连接池,由连接实现一系列接口
并提到了一种新的结构体化的接口connector,以解决open中的一大串看不懂的字符串
今天简要看了一下database/sql的基本用法
这是一个接口,用来抽象化各种不同的数据库,使得对他们的操作一致的格式,而具体的连接就需要导入实现这个接口的包,对于mysql来说就是托管在github上的driver
调用sql.Open来连接及错误处理等一系列快速访问的模型
并学习了部分的设计原理,但没有了解具体细节,大概的就是从连接池中获取连接,直到所有连接都失败,迫不得已才选择新建一个连接。将连接放回连接池,由连接实现一系列接口
并提到了一种新的结构体化的接口connector,以解决open中的一大串看不懂的字符串
展开
评论
点赞
#青训营 x 字节后端训练营#
错误处理较为简洁,error是一个接口,仅一个error()的返回string类型的方法。
errors.New(“”)可以返回错误信息
panic 与 recover,一个用于主动抛出错误,一个用于捕获panic抛出的错误
引用其中笔记:
1、panic 在没有用 recover 前以及在 recover 捕获那一级函数栈,panic 之后的代码均不会执行;一旦被 recover 捕获后,外层的函数栈代码恢复正常,所有代码均会得到执行;
2、panic 后,不再执行后面的代码,立即按照逆序执行 defer,并逐级往外层函数栈扩散;defer 就类似 finally;
3、利用 recover 捕获 panic 时,defer 需要再 panic 之前声明,否则由于 panic 之后的代码得不到执行,因此也无法 recover;
错误处理较为简洁,error是一个接口,仅一个error()的返回string类型的方法。
errors.New(“”)可以返回错误信息
panic 与 recover,一个用于主动抛出错误,一个用于捕获panic抛出的错误
引用其中笔记:
1、panic 在没有用 recover 前以及在 recover 捕获那一级函数栈,panic 之后的代码均不会执行;一旦被 recover 捕获后,外层的函数栈代码恢复正常,所有代码均会得到执行;
2、panic 后,不再执行后面的代码,立即按照逆序执行 defer,并逐级往外层函数栈扩散;defer 就类似 finally;
3、利用 recover 捕获 panic 时,defer 需要再 panic 之前声明,否则由于 panic 之后的代码得不到执行,因此也无法 recover;
展开
评论
点赞
#青训营 x 字节后端训练营#
接口,一种抽象的东西,对某些类所共有的某种方法抽离出来,在go中是隐式实现接口,不用使用关键字。
接口,一种抽象的东西,对某些类所共有的某种方法抽离出来,在go中是隐式实现接口,不用使用关键字。
评论
点赞
#青训营 x 字节后端训练营#
再次回顾一下结构体吧
对结构体的成员访问,可以
1 结构体.成员
2 * &结构体(指向结构体的指针).成员
3 * &结构体.成员(指向结构体成员的指针)
相邻的成员类型如果相同的话可以被合并到一行
一个命名为S的结构体类型将不能再包含S类型的成员 可以包含*S指针类型的成员
较大的结构体通常会用指针的方式传入和返回
可比较的结构体类型和其他可比较的类型一样,可以用于map的key类型
结构体的嵌套(有种继承的味道)
Go语言有一个特性让我们只声明一个成员对应的数据类型而不指名成员的名字;这类成员就叫匿名成员。匿名成员的数据类型必须是命名的类型或指向一个命名的类型的指针。
再次回顾一下结构体吧
对结构体的成员访问,可以
1 结构体.成员
2 * &结构体(指向结构体的指针).成员
3 * &结构体.成员(指向结构体成员的指针)
相邻的成员类型如果相同的话可以被合并到一行
一个命名为S的结构体类型将不能再包含S类型的成员 可以包含*S指针类型的成员
较大的结构体通常会用指针的方式传入和返回
可比较的结构体类型和其他可比较的类型一样,可以用于map的key类型
结构体的嵌套(有种继承的味道)
Go语言有一个特性让我们只声明一个成员对应的数据类型而不指名成员的名字;这类成员就叫匿名成员。匿名成员的数据类型必须是命名的类型或指向一个命名的类型的指针。
展开
评论
1
#青训营 x 字节后端训练营#
init()函数 在执行main()前进行初始化
多个文件的init()执行顺序,最内层导包的init()逐步执行到主文件的init()(对于不同包)
init函数先于main函数自动执行,不能被其他函数调用;
init函数没有输入参数、返回值;
每个包可以有多个init函数;
包的每个源文件也可以有多个init函数;
*同一个包*的init执行顺序,golang没有明确定义,编程时要注意程序不要依赖这个执行顺序。
init()函数 在执行main()前进行初始化
多个文件的init()执行顺序,最内层导包的init()逐步执行到主文件的init()(对于不同包)
init函数先于main函数自动执行,不能被其他函数调用;
init函数没有输入参数、返回值;
每个包可以有多个init函数;
包的每个源文件也可以有多个init函数;
*同一个包*的init执行顺序,golang没有明确定义,编程时要注意程序不要依赖这个执行顺序。
展开
评论
1
#青训营 x 字节后端训练营#
需先导包strconv
类型转换:
数值型:
数值类型(被转换对象) 例如:float32(15)
字符串型:
A. 字符串转整数: 使用 strconv.Atoi(string 对象)函数,返回两个值,第一个为整型值,第二个是可能的错误(使用_忽略)
B. 整数转字符串: strconv.Itoa(int 对象)一个返回值string
strconv.FormatInt(int 64,base int)//base基数,几位
C. 字符串转浮点数:strconv.ParseFloat(string对象,64/32)类A两个返回值,64代表多少位
D.浮点数转换为字符串:strconv.FormatFloat(float64对象,'f',2,64)//第一个需转换为64位的,第三个参数2表示保留几位 第二个是格式 不详解
E.字节切片与字符串互转:string([]byte对象) []byte(string对象)
接口型:
类型断言:interface对象.(type)
返回两值,type 和 bool ok(转化成功则true)
类型转换:较为复杂。。。。。
string = fmt.Sprintf("%Nd",数据)//格式化数据为字符串 d为整型
string = fmt.Sprint(int)//非格式化转字符串
需先导包strconv
类型转换:
数值型:
数值类型(被转换对象) 例如:float32(15)
字符串型:
A. 字符串转整数: 使用 strconv.Atoi(string 对象)函数,返回两个值,第一个为整型值,第二个是可能的错误(使用_忽略)
B. 整数转字符串: strconv.Itoa(int 对象)一个返回值string
strconv.FormatInt(int 64,base int)//base基数,几位
C. 字符串转浮点数:strconv.ParseFloat(string对象,64/32)类A两个返回值,64代表多少位
D.浮点数转换为字符串:strconv.FormatFloat(float64对象,'f',2,64)//第一个需转换为64位的,第三个参数2表示保留几位 第二个是格式 不详解
E.字节切片与字符串互转:string([]byte对象) []byte(string对象)
接口型:
类型断言:interface对象.(type)
返回两值,type 和 bool ok(转化成功则true)
类型转换:较为复杂。。。。。
string = fmt.Sprintf("%Nd",数据)//格式化数据为字符串 d为整型
string = fmt.Sprint(int)//非格式化转字符串
展开
评论
1
#青训营 x 字节后端训练营#
了解一下集合Map:无序的键值对的集合
简概:
定义:使用make(map[键类型]值类型, 初始容量)函数
使用map: 例:
m := map[键类型]值类型{}
m[键]=值 //修改
delete(m, "banana")//删除
了解一下集合Map:无序的键值对的集合
简概:
定义:使用make(map[键类型]值类型, 初始容量)函数
使用map: 例:
m := map[键类型]值类型{}
m[键]=值 //修改
delete(m, "banana")//删除
展开
评论
2
#青训营 x 字节后端训练营#
第8天:深入理解go的切片
切片是对数组的某一连续片段的描述,正如其字面意思一样,切片可以对数组 切,也可以对切片 切,它可看成由三部分组成,指向底层数组的指针,长度len,容量cap,
通常使用切片而不是数组,在函数内传入数组,实际上不会改变原数组,只是传入一个临时副本,但传入切片就可以改变原切片的元素,但其实传入的还是一个副本,只是这个切片副本的那个指向底层数组的指针与原切片相同,但仅此而已,当试图对函数内的副本切片进行诸如扩容等有关len,cap的操作是不会反映在原切片上的
第8天:深入理解go的切片
切片是对数组的某一连续片段的描述,正如其字面意思一样,切片可以对数组 切,也可以对切片 切,它可看成由三部分组成,指向底层数组的指针,长度len,容量cap,
通常使用切片而不是数组,在函数内传入数组,实际上不会改变原数组,只是传入一个临时副本,但传入切片就可以改变原切片的元素,但其实传入的还是一个副本,只是这个切片副本的那个指向底层数组的指针与原切片相同,但仅此而已,当试图对函数内的副本切片进行诸如扩容等有关len,cap的操作是不会反映在原切片上的
展开
评论
1
#青训营 x 字节后端训练营#
第7天:虽然是c的经典排序算法,但是当理解其原理,用go语法一样可以实现,顺便也提高自己的熟练度
结构体:type name struct{}
//相当于c中用了typedef的struct 结构体,某种意义上只有属性的类
只是结构体指针与结构体一样(当调用其属性的时候都是 . 运算符)这就有些特别了比较c需要->(但是限于一级指针,多级的话需要手动解引用)例如对于**p,需要 (*p).属性
不支持&&name,这种取多级地址
第7天:虽然是c的经典排序算法,但是当理解其原理,用go语法一样可以实现,顺便也提高自己的熟练度
结构体:type name struct{}
//相当于c中用了typedef的struct 结构体,某种意义上只有属性的类
只是结构体指针与结构体一样(当调用其属性的时候都是 . 运算符)这就有些特别了比较c需要->(但是限于一级指针,多级的话需要手动解引用)例如对于**p,需要 (*p).属性
不支持&&name,这种取多级地址
展开
评论
1