- 博客(48)
- 收藏
- 关注
原创 git ssh: Could not resolve hostname github.com: No address associated with hostname
ssh: Could not resolve hostname github.com: No address associated with hostname
2022-07-04 21:51:48
2958
1
原创 Docker安装
1.centos系统内核不能低于3.102.之前安装过docker需要进行清理3.创建阿里云镜像,目的是优先从阿里云获取镜像,加快docker的镜像拉取4.运行下面命令,下载并安装docker(docker分为(Docker版本分为CE(社区免费版)和EE(企业版,安全CE)我们通常所下载的docker为docker ce社区版的)解决方法如下:(依次输入以下命令)5.运行 docker version,查看是否运行成功...
2022-06-08 17:38:29
132
原创 MVCC案例
MVCC的执行流程案例Read View是如何保证可见性判断的呢?我们先看看Read view 的几个重要属性m_ids:当前系统中那些活跃(未提交)的读写事务ID, 它数据结构为一个List。min_limit_id:表示在生成ReadView时,当前系统中活跃的读写事务中最小的事务id,即m_ids中的最小值。max_limit_id:表示生成ReadView时,系统中应该分配给下一个事务的id值。creator_trx_id: 创建当前read view的事务IDRead view 匹
2022-04-26 21:35:16
754
原创 Mysql锁分类
Mysql锁分类为什么要加锁呢当多个用户并发存取数据时,在数据库中就会产生多个事务同时存取统一数据的情况。如果对并发操作不加以控制的话就会读取和存储不正确的数据,破环数据库的完整性和一致性锁分类关于mysql的锁只是做了一个简单的总结,有些地方总结的还不到位,具体实现还需要自己去探索...
2022-04-23 14:49:08
1081
原创 go 二维切片初始方法
go 二维切片初始方法func main() { // 方法1 row, col := 4, 5 var res [][]int for i := 0; i < row; i++ { inline := make([]int, col) res = append(answer, inline) } fmt.Println(res) // 方法2 res1 := make([][]int, row) for i := range res1 { res1[i] = mak
2022-04-19 17:32:27
804
原创 Linux (centos8)安装 MySQL 8
Linux (centos8)安装 MySQL 8 数据库下载并安装 MySQL 官方的 Yum Repositorywget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm然后进行repo的安装:rpm -ivh mysql80-community-release-el7-1.noarch.rpm执行完成后会在/etc/yum.repos.d/目录下生成两个repo文件 mysql-communi
2022-04-18 14:23:48
1060
原创 hash索引与B+树索引的适用场景,为什么用B+树索引
hash索引与B+树索引的适用场景,为什么用B+树索引1. 什么是索引,索引的作用又是什么呢● 什么是索引?索引是存储引擎用于提高数据库表访问速度的一种数据结构。就拿InnoDB来说吧,InnoDB中索引结构有两种,一种是hash索引,一种是B-Tree索引。● 索引的作用是什么呢?数据是存储在磁盘上的,每次查询都要访问磁盘,而访问磁盘需要浪费时间,没有索引的情况下,你就没有了头绪,不知道从哪下手,就只能依次进行查询,访问磁盘次数较多,浪费时间,有了索引就不一样了,就拿B+树来说,一般树的高度
2022-04-12 20:23:45
1588
原创 Map中可以作为Key的类型
Map中可以作为Key的类型1. golang中能够用 == 号直接比较的数据类型有如下整型 int、浮点型 float、字符串 string、布尔型 bool、复数型 complex、指针型 pointer、通道型 channel、接口型 interface、数组型 array2. 不能直接比较的切片型 slice、键值对型 map、函数型 funcgolang中map的key必须是可以比较的,要使key值不一样就需要进行比较,因此,map中的key是可以使用==进行比较的。slice,m
2022-04-03 16:28:45
3605
原创 go 语言结构体相关方面问题
go 语言结构体相关方面问题1. go struct能不能比较golang中能够用 == 号直接比较的数据类型有如下整型 integer、浮点型 float、字符串string、布尔型 boolean、复数型 complex、指针型 pointer、通道型 channel、接口型interface、数组型array不能直接比较的切片型 slice、键值对型map、函数型 func相同结构体type S struct { Name string Age int
2022-04-03 16:12:39
261
原创 开启和关闭bin log
bin log 日志如何查看bin log是否开启show variables like 'log_bin';value为off就是关闭,on就是打开如何开启bin log要开启log_bin,很简单,只需要将my.ini中#log-bin: 前的#去掉即可注意:要先关闭mysql服务再修改如何关闭服务先关闭mysql的服务再在my.ini中注释掉log-bin:,在他前面添加一个#在my.ini文件中的[mysqld]下面添加skip-log-bin注意:先关闭服务再修
2022-03-31 20:27:00
1877
原创 Mutex和RWMutex
锁的实现原理(Mutex和RWMutex)sync.Mutex(互斥锁)为什么需要锁在高并发或多goroutine同时执行时,可能会写入同一块内存var count intvar mu sync.Mutexfunc func1(){ for i :=0;i < 1000; i++{ go func(){ count =count+1 }() } time.Sleep(time.Second) fmt
2022-03-31 19:54:36
578
原创 panic和recover的实现原理
panic和recoverpanicpanic的数据结构type _panic struct{ argp unsafe.Pointer //defer的参数空间地址 arg interface //panic的参数 link *_panic //链接之前的panic recovered bool//是否被恢复 aborted bool //是否被终止}同defer一样,每个goroutine数据结构中实际上也有一个panic链表指针,该指针指向一个panic的单链表,每次执行一个pa
2022-03-22 20:49:34
473
原创 go语言方法的底层解析
方法方法本质上就是普通的函数,而接受者就是隐含的一个参数对象案例1:(值类型接收者)type A struct{ name string}func (a A)Name (string){ a.name ="Hi!"+a.name return a.name}func main(){ a := A(name:"zxp") fmt.Println (a.Name())go语言中传参值拷贝,所以局部变量a被拷贝到参数空间,如下图:字符串string数据结构中有
2022-03-20 16:37:29
604
原创 闭包底层分析
闭包1. 什么是闭包在一个外函数中定义一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。通俗的讲就是在函数内部引用了函数内部的变量的函数案例Go语言中通过匿名函数实现闭包的func adder()func()int{ c=2 return func()int{ return c }}func main(){ fl := adder() f2 := adder() fmt.Println(f1()) fmt.Println(
2022-03-20 09:28:44
323
原创 对defer的认识
deferdefer内部结构源码包src/runtime/panic.go定义了两个方法分别用于创建defer和执行defer。deferproc(): 在声明defer处调用,其将defer函数存入goroutine的链表中;deferreturn():在return指令,准确的讲是在ret指令前调用,其将defer从goroutine链表中取出并执行。可以简单这么理解,在编译阶段,声明defer处插入了函数deferproc(),在函数return前插入了函数deferreturn()。
2022-03-12 17:33:23
1566
原创 函数底层传参和返回值解析
文章目录函数调用栈函数栈帧函数传参值传递指针传递函数返回值函数调用栈func A(){ ... ...}func B(){ ... ...}我们按照编程语言的语法定义的函数,会被编译成一堆机器指令,写入可执行文件,程序执行时,可执行文件加载到内存,这些机器指令对应到虚拟地址空间中,位于代码段,如下图如果在一个函数中调用另一个函数,编译器就会对应生成一条call指令,程序执行到这条指令的时候,就会跳转到被调用函数入口处开始执行,每个函数的最后都有一条ret指令,负责在函数结束后跳回到
2022-03-10 16:40:40
228
原创 go语言map底层学习
文章目录map数据结构bucket 数据结构键值对存储(key, value)查找过程hash冲突负载因子扩容扩容的条件增量扩容map数据结构Golang的map使用哈希表作为底层实现,一个哈希表里可以有多个哈希表节点,也即bucket,而每个bucket就保存了map中的一个或一组键值对。map数据结构由runtime/map.go:hmap定义:type hmap struct{ count int //当前保存的数据元素 ... B uint8 ... buckets unsaf
2022-03-09 21:59:45
835
1
原创 切片底层学习
切片的数据结构切片本身并不是动态数组或数组指针。它内部实现的数据结构通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内。切片本身是一个只读对象,其工作机制类似于数组指针的一种封装。切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个与指向数组的动态窗口。切片的长度可以在运行时修改,最小为 0 最大为相关数组的长度:切片是一个长度可变的数组。Slice的数据结构定义如下type slice struc
2022-03-08 22:18:33
783
原创 JWT案例实现
JWT互联网服务用户认证流程1、用户向服务器发送用户名和密码。2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。3、服务器向用户返回一个 session_id,写入用户的 Cookie。4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者
2022-02-18 11:03:44
1421
原创 go语言casbin快速入门
casbin快速入门casbin将访问控制模型抽象到一个基于 PERM(Policy,Effect,Request,Matchers) 元模型的配置文件(模型文件)中policy是策略或者说是规则的定义。它定义了具体的规则。request是对访问请求的抽象,它与e.Enforce()函数的参数是一一对应的matcher匹配器会将请求与定义的每个policy一一匹配,生成多个匹配结果。effect根据对请求运用匹配器得出的所有结果进行汇总,来决定该请求是允许还是拒绝。下载依赖
2022-02-14 22:03:31
2959
2
原创 ShouldBind多次绑定失效
ShouldBindJSON–中间件绑定解析后,再次使用则出现无效的错误解决方法:POST的情况:需使用:ShouldBindBodyWithGET的情况下和POST的(application/form-data):多次绑定的解析则直接的使用:Bind
2022-02-11 21:05:52
774
原创 使用swagger生成接口文档案例
使用swagger生成接口文档package mainimport ( "github.com/gin-gonic/gin" ginSwagger "github.com/swaggo/gin-swagger" "github.com/swaggo/gin-swagger/swaggerFiles" _ "main/docs" "net/http")// Test// @Summary 学生登录// @Product json// @Accept mpfd// @Tags 登录
2022-02-11 16:04:48
785
原创 go语言用cookie实现登录(gin+gorm)
go语言用cookie实现登录(gin+gorm)第一步数据库验证表单提交的用户名和密码是否正确//获取表单提交的数据name := c.PostForm("name")password := c.PostForm("password")//每个人的验证都基本不同,代码就省略了//将获得的数据进行数据库验证,如果验证成功,则进行第二步在验证成功的地方设置cookie//下方代码为我验证成功的地方,设置cookieif admin1.Password == password { c.Se
2022-02-09 20:31:41
2211
原创 gorm实现数据库连接以及创建,查询,更新,删除的测试
数据库操作(mysql,gorm实现基本的增删改查)文章目录数据库操作(mysql,gorm实现基本的增删改查)连接MySQl 驱动程序提供了 [一些高级配置](https://github.com/go-gorm/mysql) 可以在初始化过程中使用创建用指定的字段创建记录批量插入根据Map创建查询注意first和lastwhere查询Struct & Map 条件的where查询内联条件Not条件or条件选择特定字段OrderLimit &OffsetDistinct(去重复)join
2022-02-09 19:58:12
3141
原创 重复写first则会报错
Gorm中踩坑之firstvar user UserInfodb.First(&user)fmt.Println(user)fmt.Println("==========================")db.First(&user, "2")fmt.Println(user)fmt.Println("==========================")这样写会嵌套使用导致报错:record not found[1.629ms] [rows:0] SELECT
2022-01-28 09:57:12
354
原创 navicat删除记录后id不是从想要的数开始
Navicat删除记录后id如何更新在mysql中选择对应的表输入以下命令1、使用以下命令来重设自增的起始值// n表示从几开始自增,1就表示从1开始alter table user_tests AUTO_INCREMENT=n2、使用以下命令清空数据表,ID就会从1开始truncate table user_tests...
2022-01-27 16:26:35
2805
原创 1366 - Incorrect string value: ‘\xE5\xBC\xA0\xE4\xB8\x89’ for column ‘name’ at row 1。
数据库报错1366 - Incorrect string value: ‘\xE5\xBC\xA0\xE4\xB8\x89’ for column ‘name’ at row 1。通过Navicat for MySQL将数据库属性设置如下不行的话试着重启一下NaviCat
2022-01-26 19:44:16
1651
原创 下载依赖go get -u gorm.io/driver/sqlite报错解决办法
下载 依赖go get -u gorm.io/driver/sqlite报错解决办法报错:exec: “gcc”: executable file not found in %PATH%1. 报错原因在windows下无GCC编译器导致的,下载一个MinGW-w64即可2. 解决办法:1. 下载MinGW1.1 什么是MinGW?MinGW 的全称是:Minimalist GNU on Windows 。它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含
2022-01-26 17:18:32
1809
1
原创 go基础(接口)
Go语言基础(简便总结特别注意的地方)接口在Go语言中接口(interface)是一种类型,一种抽象的类型。1. 接口的定义type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 …}2. 接口的简单应用//定义一个接口type Sayer interface{ say()}//定义一个结构体type cat struct{ name string}//实现叫的方法func (c
2022-01-17 21:58:00
162
原创 go基础(结构体)
Go语言基础(简便总结特别注意的地方)1. 类型别名和自定义类型1.1 自定义类型//将MyInt定义为int类型type MyInt int//通过type关键字的定义,MyInt就是一种新的类型,它具有int的特性。1.2 类型别名//rune和byte就是类型别名type byte = uint8type rune = int321.3 类型定义和类型别名//类型定义type NewInt int //type of :main.NewInt//类型别名type M
2022-01-16 22:13:02
270
原创 go基础(指针)
Go语言基础(简便总结特别注意的地方)1. 指针1.1 指针地址和指针类型&:用来取对变量取地址如:&v*代表指针,*p 为值 ,p为地址func main() { a := 10 b := &a fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078 fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*int fmt.P
2022-01-16 21:18:12
63
原创 go基础(函数)
Go语言基础(简便总结特别注意的地方)函数1. 函数的定义方式func 函数名(参数)(返回值){ 函数体}//第一种(不含有参数还有返回值)func sayHello() { fmt.Println("Hello 沙河")}//第二种(含有参数和返回值)func intSum(x int, y int) int { return x + y}//第三种(含有参数或者返回值)2. 参数的书写类型//第一种func intSum(x,y int)//第二种
2022-01-16 21:00:24
124
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人