golang数据库编程
SQL语法简介
SQL(i/ˈsiːkwəl/; Structured Query Language)是一套语法标准,不区分大小写。MySQL、sql-server和Oracle都是关系型数据库,在一些高级语法上跟标准SQL略有出入。
以管理员登录
1mysql -h localhost -P 3306 -u root -p'123456'
-h:mysql server host,不写时默认是localhost。
-P:mysql server port,不写时默认是3306。
-u:user name,-u后可以加空格也可以不加。
-p:password,密码中可能包含空格,所以要加引号。高版本的mysql不允许在命令行中直接输入密码,此时只输入-p后面不要写密码即可。
创建表
1234567891011create table if not exists student( id int not null auto_increment comment '主键自增id', name char(10) not null com ...
golang中websocket编程
WebSocket协议解读
websocket和http协议的关联:
都是应用层协议,都基于tcp传输协议。
跟http有良好的兼容性,ws和http的默认端口都是80,wss和https的默认端口都是443。
websocket在握手阶段采用http发送数据。
websocket和http协议的差异:
http是半双工,而websocket通过多路复用实现了全双工。
http只能由client主动发起数据请求,而websocket还可以由server主动向client推送数据。在需要及时刷新的场景中,http只能靠client高频地轮询,浪费严重。
http是短连接(也可以实现长连接, HTTP1.1 的连接默认使用长连接),每次数据请求都得经过三次握手重新建立连接,而websocket是长连接。
http长连接中每次请求都要带上header,而websocket在传输数据阶段不需要带header。
WebSocket是HTML5下的产物,能更好的节省服务器资源和带宽,websocket应用场景举例:
html5多人游戏
聊天室
协同编辑
基于实时位置的应用
股票实时 ...
golang中socket编程
网络通信过程
DMA:网卡和磁盘数据拷贝到内存流程比较固定,不涉及到运算操作,且非常耗时。在磁盘嵌入一个DMA芯片,完成上述拷贝工作,把CPU解脱出来,让CPU专注于运算。
mmap:用户空间和内核空间映射同一块内存空间,从而达到省略将数据从内核缓冲区拷贝到用户空间的操作,用户空间通过映射直接操作内核缓冲区的数据。
阻塞式网络I/O
非阻塞式网络I/O
多路复用网络I/O
socket把复杂的传输层协议封装成简单的接口,使应用层可以像读写文件一样进行网络数据的传输。
socket通信过程
TCP CS架构
网络通信模型
OSI参考模型
TCP/IP模型
传输层数据大小的上限为MSS(Maximum Segment Size, 最大分段大小),网络接口层数据大小的上限为MTU(Maximum Transmit Unit, 最大传输单元)。
TCP协议解读
MSS=MTU-ip首部-tcp首部,MTU视网络接口层的不同而不同。TCP在建立连接时通常需要协商双方的MSS值。应用层传输的数据大于MSS时需要分段。
TCP首部
前20个字节是固定的,后面还4 ...
golang标准库http
http协议
http:超文本传输协议Hyper Text Transfer Protocol。
http属于应用层协议,它在传输层用的是tcp协议。
无状态,对事务处理没有记忆能力(对比TCP协议里的确认号)。如果要保存状态需要引用其他技术,如cookie。
无连接,每次连接只处理一个请求。早期带宽和计算资源有限,这么做是为了追求传输速度快,后来通过Connection: Keep-Alive实现长连接。http1.1废弃了Keep-Alive,默认支持长连接。
请求方法
请求方法
解释
GET
请求获取Request-URI所标识的资源
POST
向URI提交数据(例如提交表单或上传数据)
HEAD
类似于GET,返回的响应中没有具体的内容,用于获取报头
PUT
对服务器上已存在的资源进行更新
DELETE
请求服务器删除指定的页面
CONNECT
HTTP/1.1预留,能够将连接改为管道方式的代理服务器
OPTIONS
查看服务端性能
TRACE
回显服务器收到的请求,主要用于测试或诊断
PATCH
同PUT,可只对资源的一 ...
golang并发编程
并发模型
任何语言的并行,到操作系统层面,都是内核线程的并行。同一个进程内的多个线程共享系统资源,进程的创建、销毁、切换比线程大很多。从进程到线程再到协程, 其实是一个不断共享, 不断减少切换成本的过程。
协程
线程
创建数量
轻松创建上百万个协程而不会导致系统资源衰竭
通常最多不能超过1万个
内存占用
初始分配4k堆栈,随着程序的执行自动增长删除
创建线程时必须指定堆栈且是固定的,通常以M为单位
切换成本
协程切换只需保存三个寄存器,耗时约200纳秒
线程切换需要保存几十个寄存器,耗时约1000纳秒
调度方式
非抢占式,由Go runtime主动交出控制权(对于开发者而言是抢占式)
在时间片用完后,由 CPU 中断任务强行将其调度走,这时必须保存很多信息
创建销毁
goroutine因为是由Go runtime负责管理的,创建和销毁的消耗非常小,是用户级的
创建和销毁开销巨大,因为要和操作系统打交道,是内核级的,通常解决的办法就是线程池
查看逻辑核心数
1fmt.Println(runtime.NumCPU())
Go语言的MPG并发模 ...
golang数据结构与算法
链表
链表是一种非连续的存储容器,由多个节点组成,节点通过一些变量记录彼此之间的关系,链表有多种实现方法,如单链表、双链表等
在Go语言中,链表使用 container/list 包来实现,内部的实现原理是双链表,链表能够高效地进行任意位置的元素插入和删除操作。
初始化列表
list 的初始化有两种方法:分别是使用 New() 函数和 var 关键字声明,两种方法的初始化效果都是一致的。
通过 container/list 包的 New() 函数初始化 list
1变量名 := list.New()
通过 var 关键字声明初始化 list
1var 变量名 list.List
链表与切片和 map 不同的是,链表并没有具体元素类型的限制,因此,链表的元素可以是任意类型,这既带来了便利,也引来一些问题,例如给链表中放入了一个 interface{} 类型的值,取出值后,如果要将 interface{} 转换为其他类型将会发生宕机。
在链表中插入元素
双链表支持从队列前方或后方插入元素,分别对应的方法是 PushFront 和 PushBack。
提示
这两个方法都会返回 ...
golang加密算法
对称加密
加密过程的每一步都是可逆的。加密和解密用的是同一组密钥。异或是最简单的对称加密算法。
12345678910//XOR 异或运算,要求plain和key的长度相同func XOR(plain string, key []byte) string { bPlain := []byte(plain) bCipher := make([]byte, len(key)) for i, k := range key { bCipher[i] = k ^ bPlain[i] } cipher := string(bCipher) return cipher}
DES(Data Encryption Standard)数据加密标准,是目前最为流行的加密算法之一。对原始数据(明文)进行分组,每组64位,最后一组不足64位时按一定规则填充。每一组上单独施加DES算法。
DES子密钥生成
初始密钥64位,实际有效位56位,每隔7位有一个校验位。根据初始密钥生成16个48位的子密钥。
N取值从1到16,N和x有固定的映射表。 ...
golang反射
反射介绍
反射就是在运行期间(不是编译期间)探知对象的类型信息和内存结构、更新变量、调用它们的方法。
反射的使用场景:
函数的参数类型是interface{},需要在运行时对原始类型进行判断,针对不同的类型采取不同的处理方式。比如json.Marshal(v interface{})。
在运行时根据某些条件动态决定调用哪个函数,比如根据配置文件执行相应的算子函数。
Go标准库里的json序列化就使用了反射。
1234567891011type User struct { Name string Age int Sex byte `json:"gender"`}user := User{ Name: "钱钟书", Age: 57, Sex: 1,}json.Marshal(user) //返回 {"Name":"钱钟书","Age":57,"gender":1 ...
golang泛型
在有泛型之前,同样的功能需要为不同的参数类型单独实现一个函数。
123456789func add4int(a, b int) int { return a + b}func add4float32(a, b float32) float32 { return a + b}func add4string(a, b string) string { return a + b}
使用泛型
12345678type Addable interface{type int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128,string}func add[T Addable](a,b T)T{ return a+b}
在go1.17中泛型默认没有开启,如果想用需要加-gcflags=-G=3,或者设置环境变量expo ...
golang压缩
1. zip
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586package mainimport ( "archive/zip" "fmt" "io" "log" "os" "path/filepath" "strings")func new_zip(files []string) { // 创建压缩文件 fout, err2 := os.OpenFile("test2.zip", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) if err2 != nil { log.Fatal(err2) & ...