- 博客(51)
- 收藏
- 关注
原创 go语言gin框架cookie和session
CookieCookie的由来HTTP协议是无状态的,这就存在一个问题。无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。Co
2021-03-23 10:03:16
2437
1
原创 go语言之Linux上安装Docker
第一步:卸载旧版本docker的旧版本被称为Docker、docker.io或docker-engine。如果安装了这些,请卸载它们:sudo apt-get remove docker docker-engine docker.io containerd runc第二步:设置存储库更新apt软件包索引并安装软件包,以允许apt使用HTTPS的存储库:sudo apt-get update sudo apt-get install \ apt-transport-https \
2021-03-22 12:55:55
296
原创 go语言gin框架路由拆分与注册
gin框架路由拆分与注册2020年4月16日 | Golang 本文总阅读量9334次本文总结了我平时在项目中积累的关于gin框架路由拆分与注册的若干方法。gin框架路由拆分与注册基本的路由注册下面最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo。package mainimport ( "net/http" "github.com/gin-gonic/gin")func helloHandler(c *gin.Context) { c.JSON(ht
2021-03-21 16:26:24
582
原创 go语言Gin框架快速指南
Gin框架介绍Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。 如果你是性能和高效的追求者, 你会爱上Gin。Gin框架介绍Go世界里最流行的Web框架,Github上有32K+star。 基于httprouter开发的Web框架。 中文文档齐全,简单易用的轻量级框架。Gin框架安装与使用安装下载并安装Gin:go get -u github.com/gin-gonic/gingin实现h
2021-03-21 15:26:36
852
1
原创 go语言MySQL的SQL预处理,sql注入,go语言操作mysql数据库事务
什么是预处理?普通SQL语句执行过程:客户端对SQL语句进行占位符替换得到完整的SQL语句。客户端发送完整SQL语句到MySQL服务端MySQL服务端执行完整的SQL语句并将结果返回给客户端。预处理执行过程:把SQL语句分成两部分,命令部分与数据部分。先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预处理。然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换。MySQL服务端执行完整的SQL语句并将结果返回给客户端。为什么要预处理?优化MySQ
2021-03-20 16:04:43
929
原创 go语言操作MySQL
下载依赖go get -u github.com/go-sql-driver/mysql使用MySQL驱动func Open(driverName, dataSourceName string) (*DB, error)Open打开一个dirverName指定的数据库,dataSourceName指定数据源,一般至少包括数据库文件名和其它连接必要的信息。package mainimport ( "database/sql" "fmt" _ "github.com/go-sql-dr
2021-03-20 14:55:52
264
1
原创 go基础之网络编程
TCP协议TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。TCP服务端一个TCP服务端可以同时连接很多个客户端,例如世界各地的用户使用自己电脑上的浏览器访问淘宝网。因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次链接就创
2021-03-20 10:43:02
191
原创 go基础之sync.Once,sync.Map
在前面的话:这是一个进阶知识点。在编程的很多场景下我们需要确保某些操作在高并发的场景下只执行一次,例如只加载一次配置文件、只关闭一次通道等。Go语言中的sync包中提供了一个针对只执行一次场景的解决方案–sync.Once。sync.Once只有一个Do方法,其签名如下:func (o *Once) Do(f func()) {}备注:如果要执行的函数f需要传递参数就需要搭配闭包来使用。加载配置文件示例延迟一个开销很大的初始化操作到真正用到它的时候再执行是一个很好的实践。因为预先初始化一个变
2021-03-20 08:40:38
255
原创 go基础并发安全和锁
有时候在Go代码中可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生静态文体(数据静态)。类比现实生活中的例子,有十字路口被个个方向的车竞争;有火车上的卫生间被车厢上的人竞争例子:package mainimport ( "fmt" "sync")var wy sync.WaitGroupvar x intfunc add() { for i := 0; i < 50000; i++ { x += 1 } wy.Done()}func
2021-03-19 19:19:40
186
原创 go语言基础之并发编程,channel
channel单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信。如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接
2021-03-19 14:27:48
138
原创 go基础之并发编程,goroutine
goroutine在java/c++中我们要实现并发编程的时候,我们通常需要自己维护一个线程池,并且需要自己去包装一个又一个的任务,同时需要自己去调度线程执行任务并维护上下文切换,这一切通常会耗费程序员大量的心智。那么能不能有一种机制,程序员只需要定义很多个任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行呢?Go语言中的goroutine就是这样一种机制,goroutine的概念类似于线程,但 goroutine是由Go的运行时(runtime)调度和管理的。Go程序会智能地将 gorouti
2021-03-19 11:52:50
157
原创 go基础之strconv包的使用
strconv包实现了基本类型与字符串之间的转换Atoi()和Itoa()函数的使用package mainimport ( "fmt" "strconv")//strconv包的使用func main() { var strr string strr = "123456" //将字符串类型的整数转换为int v, err := strconv.Atoi(strr) if err != nil { fmt.Println(err) return } fmt.Pri
2021-03-19 09:42:18
279
原创 go基础time包的使用
package mainimport ( "fmt" "time")func main() { now := time.Now() //获得当前时间 year := now.Year() //年 month := now.Month() //月 day := now.Day() //日 hour := now.Hour() //时 minute := now.Minute() //分 second := now.Second() //秒
2021-03-14 20:02:37
132
原创 go基础之文件操作
package mainimport ( "bufio" "fmt" "io" "io/ioutil" "os")// read 自己实现的读文件的函数func read() { //os包中的OpenFile方法创建文件对象,返回的是一个*os.File的对象,和报错信息 fileObj, err := os.OpenFile("./main.go", os.O_APPEND, 0644) if err != nil { fmt.Println(err) return
2021-03-14 17:44:58
67
原创 go语言基础之接口,空接口,类型断言
接口在Go语言中的接口是一种类型,一种抽象类型,interface是一组方法(method)的集合,接口就像是定义了一个协议,一个规则,,只要一台机器有洗衣服和甩干功能我们就叫他是洗衣机,不关心属性,只关心行为接口实现的条件一个对象只要全部实现了接口中的方法,那么就实现了这个接口,换句话说,接口就是一个需要实现的方法列表接口类型变量接口类型可以存储所有实现了该接口的实例,类型与接口的关系一个类型可以同时实现多个接口,这些接口之间是独立的接口的值接口的存储分为两部分,一部分是具体类型,一部分
2021-03-12 18:14:01
135
原创 go语言基础之结构体
结构体Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。 也就是我们可以通过struct来定义自己的类型了。package mainimport "fmt"func main() { //结构体的定义 type person struct { name
2021-03-11 18:59:44
185
原创 go基础之函数,匿名函数,defer,panic/recover
函数函数是一个组织好的,可以重复使用的,用于执行,指定任务的代码块。Go语言支出,函数,匿名函数和闭包package mainimport ( "fmt""strings")func main() { // 定义函数的格式 // func 函数名(参数)(返回值){ // } //通过函数名就可以调用函数,函数有参数的情况下, // 必须填写参数,调用函数的结果,就是返回值 fmt.Println("fu1函数", fu1(3, 2))
2021-03-10 17:22:35
217
原创 go语言基础之map
Go语言中提供的映射关系容器为map,其内部使用散列表hash实现 mapmap是一种无序的基于key-value的数据结构,必须初始化才能使用package mainimport "fmt"func main() { // map的基本使用,map是引用类型,需要初始化,map可以自动扣扩容 // 初始化map,第一个参数是map的类型,第二个参数是map的容量 //容量要尽量的估算准确,不然就会在代码运行期间扩容,造成性能的下降 mapp := make(map
2021-03-08 15:40:20
160
原创 go语言基础之指针和new
Go语言中的指针Go语言中不存在指针操作,只需要记住两个符号&:取地址:根据地址取值取地址操作符&和根据地址取值操作符,是一对互补的操作1.对变量进行取地址操作,可以获得变量的指针2.指针变量的值是指针3.对指针变量进行取值操作,可以获得指针变量指向的原变量的值new和makeGo语言中对于引用类型的变量,我们在使用的时候需,不仅要声明,还要分配内存空间,否则我们的值没有办法存储,而对于值类型的变量就不需要分配内存,因为我们在声明的时候,已经分配好了内存,要分配内存就引出了
2021-03-08 14:44:12
478
原创 go语言基础之数组和切片
go语言基础之数组Array数组是同一种数据类型的集合,Go语言中,数组从声明时就确定,使用时可以修改数组成员,数组的大小不可以变化。数组是值类型,,将数组赋值给另一个变量,就相当于复制了一份,就变成了两个数组,两个数组之间的操作不冲突注意:数组支持==和!=操作,因为数组是值类型package mainimport "fmt"func main() { //数组 //存放元素的容器 //必须指定数组存放的类型和容量 //数组的长度是数组类型的一部分
2021-03-08 13:21:31
149
原创 go语言基础之逻辑控制
Go语言基础流程控制if流程控制是每一种语言控制逻辑走向和执行次序的重要部分,流程控制可以说是每一种语言的经脉Go语言中主要的流程控制有if和for,而switch和goto主要是为了简化代码,降低重复代码而生的结构,属于扩展类的流程控制package mainimport "fmt"func main() { //基本if语句 i := 40 if i > 18 { fmt.Println("您已经成年了") } else {
2021-03-07 15:03:02
193
原创 go基础之字符串操作
字符串Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型一样,go语言字符串的内部实现用utf-8编码,字符串的值为双引号””中的内容,可以在go语言的源码中直接添加非ASCII码字符字符串的转义\r 回车 \n 换行 \t 制表符 \’ 单引号 \” 双引号 \ 反斜杠多行字符串Go语言中要定一个多行字符串时,要用反引号``package mainimport "fmt"func main() { s :=
2021-03-02 17:58:06
200
原创 go基础之基本类型整形,浮点型,布尔型
Go语言基础之基本数据类型Go语言中有丰富的数据类型,除了基本的整形,浮点型,布尔型,字符型,还有数组,切片,结构体,函数,map,通道(channel)等基本数据类型整形整形分为两大类,按长度分为:int8,int16,int32,int64对应无符号类型:uint8,uint16,uint32,uint64,其中uint6就是我们熟知的byte,int16对应c语言中的short,int64对应c语言中的long型。特殊类型uint 32位操作系统上就是uint32,64位操作系统就是u
2021-03-01 17:47:03
250
原创 go常量,变量
Go基础跳过安装环节编写第一个go程序,输出”hello wolrd”package mainimport ( "fmt")func main() { fmt.Print("hello wolrd")}所有的.go文件中都有一个package关键字,用来声明文件在哪个包下main中的main函数,编译后会成为一个可执行文件,作为程序的入口import关键字用来导入包声明变量Go语言中的变量名的定义建议用小驼峰...
2021-02-27 19:18:48
105
原创 mysql数据库事务
事务的四大特征原子性:事务是最小的单位,不可分割一致性:事务要求所有的dml操作,必须保证同时成功或者同时失败隔离性:事务之间具有隔离性持久性:是事务的保证,事务终结的目标(内存的数据持久到硬盘文件中)事务相关的术语开启事务:start transaction事务结束:end transaction提交事务:commit transaction事务回滚:rollbock tran...
2019-10-22 15:26:21
174
原创 mysql常用触发器,视图,存储过程
视图:CREATE VIEW demo AS SELECT * FROM bookCREATE VIEW:创建一个视图AS:执行的SELECT存储过程:CREATE PROCEDURE a( IN p INT(10), OUT h INT(10) )BEGINSELECT id INTO h FROM book WHERE id = p;END;CALL a(4,@h)SELE...
2019-10-22 11:10:28
172
原创 SQL增删改查
查询:SELECT *,COUNT(DISTINCT id) FOR book,user WHERE id=bookid AND name=‘左玉昆’ GROUP BY id HAVING COUNT(id)<=1 ORDER BY usreid DESC LIKE’%’ LIMIT (5)select:查询关键字distinct:去重关键字for:要查询的表where:第一个表达式...
2019-10-22 09:17:58
214
原创 mysql数据库的数据类型
mysql数据库提供了整数类型,浮点数类型,定点数类型和位类型,日期和时间类型,字符串类型。整数类型mysql数据库除了支持标准sql中所有的整数类型(SMALLINT和INT)外,还进行了相应扩展。扩展后增加了TINYINT,MEDIUMINT和BIGINT这三个整数类型在计算机中所有的数据都存储为不同组合的二进制码,整数类型数据也不例外,只不过整数是有符号要的因此最左边一位是指他是正数...
2019-09-24 16:10:08
182
原创 mysql数据库中存储引擎
认识存储引擎存储引擎是mysql数据库管理系统的一个重要特征,在具体开发时,为了提高mysql数据库管理系统的使用效率和灵活性,可根据实际需要来选择存储引擎。因为存储引擎指定了表的类型即如何存储和索引数据,是否支持事务等。同时存储引擎也决定了表在计算机中的存储方式。查看数据库管理系统支持的存储引擎:SHOW ENGINES...
2019-09-24 14:26:05
244
原创 mysql数据库基础操作
数据库和数据库对象当系统安装完mysql服务器之后,会附带一些数据库,用于记录数据库必须的信息,用户不能直接修改这些数据库,各个数据库的作用如下。information_schema:主要存储系统中的一些数据库对象,如用户表信息,列信息,权限信息,字符集信息和分区信息等performance_schema:主要存储数据库性能参数。mysql:主要存储系统或用户权限信息。test:该数据...
2019-09-23 19:38:15
100
原创 mysql数据库概述
一.数据库的基本概念所谓数据管理,是指对各种数据进行分类,组织,编码,存储,检索和维护,发展到现在,数据管理技术经历了三个阶段,分为人工管理阶段,文件系统阶段和数据库系统阶段。人工管理阶段特点:数据不能长期保存程序本身管理数据数据不能共享数据不具有独立性文件系统阶段特点:数据可以长期保存数据由文件系统管理数据冗余大,共享性差数据独立性差数据库系统阶段数据实现结构化数据实...
2019-09-23 18:51:33
885
原创 数据结构与算法 Python实现 图
一个关系图,互相连接,通过邻居查找,浪费空间from collections import dequeclass Queue(object): def __init__(self): self._itme_linked_list = deque() def __len__(self): return len(self._itme_linke...
2019-09-13 15:04:35
193
1
原创 数据结构与算法 Python实现 二叉查找树
二叉树的特点,左孩子大于父亲,右节点小于父亲#二叉树的表示#节点class BSTNode(object): def __init__(self,key, value,right = None,left = None): self.key, self.value,self.right,self.left = key, value , right , leftcla...
2019-09-13 15:02:44
191
原创 数据结构与算法 python实现 优先级对列
根据最大堆的特性我们给每条数据一个优先级,优先级大的,就会在上层,小的就会在下层,然后我们先根序遍历#实现一个定长的数组arroyclass Array(object): #初始化 def __init__(self,size = 32): # self._size = size #长度为size,value全为None的列表...
2019-09-13 14:57:56
117
原创 数据结构与算法 Python实现 堆和堆排序
什么是堆堆是一种完全二叉树最大堆:对于每个非叶子节点,都比他的两个孩子大,称为最大堆最大堆特性,最大堆里的根节点往往是最大值最小堆:和最大堆相反,每个非叶子节点,两个孩子都比他大堆的表示:用二叉树表示#实现一个定长的数组arroyclass Array(object): #初始化 def __init__(self,size = 32): # ...
2019-09-13 14:11:21
170
原创 数据结构与算法,Python实现 树与二叉树
二叉树根节点(root)是最上层节点路径(path)从起始节点到终止节点经历的边父亲(parent)除了根节点,每一个上层的节点,就是他的父亲节点孩子(children)每个节点由边指向的下层节点兄弟(siblings)同一个父亲并且处在同一个节点子树(subtree)每个节点包含他所有的后代组成的子树叶子节点(leaf node)没有孩子的节点成为子节点...
2019-09-13 11:02:59
290
原创 数据结构与算法 Python实现 快速排序
快速排序分为三步选择基准值,pirot将数组分为两个字数组,小于基准值的元素和大语句准直的元素,这个过程称之为prtition对这两个数组进行排序合并结果def quicksort(array): #当排序的数组小于2就不排序 if len(array) < 2: return array else: #定一下标 ...
2019-09-13 10:37:19
128
原创 数据结构与算法 python实现 高级排序算法
分治法与归并排序归并是分治法比较经典的应用分治法的三步骤分解原问题成若干子问题,这些子问题是原问题最小的实例解决这些子问题,递归的求解子问题,档子问题的规模足够小可以直接求解合并这些子问题的解,成源问题的解归并排序法,三步:分解,解决,合并时间复杂度T(n)#归并排序def merge_sort(seq): #判断数组的长度是不是还可以再分 if len(se...
2019-09-13 09:57:39
191
原创 数据结构与算法 Python实现 冒泡排序 选择排序 插入排序
冒泡排序def bubbleSort(arr): n = len(arr) # 遍历所有数组元素 for i in range(n): # Last i elements are already in place for j in range(0, n-i-1): if arr[j] > arr[j...
2019-09-13 09:40:54
172
原创 数据结构与算法 python实现 线性查找,二分查找
线性查找:从头找到尾,找到我们想要的就把他返回二分查找:取到一个数组的中间值,如果要查的数据比中间值大,下标+1,否则下标-1#二分查找def binary_search(sorked_array,val): if not sorked_array: return -1 beg = 0 end = len(sorked_array) -1 w...
2019-09-13 09:32:46
186
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人