- 博客(470)
- 资源 (5)
- 收藏
- 关注
原创 第二十五:channel 底层原理:channel 优雅的关闭
fmt.Println(original) // 输出: [1 2 3]深拷贝,要初始化一个切片的make。关闭一个channel 通道。
2025-04-14 01:16:11
280
原创 第二十四:查看当前 端口号是否被占用
系统将显示监听该端口的进程信息,包括进程名称、进程ID、用户和协议等。-P参数表示不将端口号转换为服务名,-n参数表示不将IP地址转换为主机名。这样可以加快查询速度,并显示原始信息。netstat -tulnp | grep :3306 // 在linux 下查看是哪一个端口的进程被占用。查看具体的: ps aux | grep docker // 查找整个进程。netstat -anp tcp | grep 端口号 // 查看进程名。lsof -P -n -i :8080 // 查看进程名。
2025-04-13 19:45:41
593
原创 ssh免密连接服务器
2.cd /root/.ssh目录,会看到id_rsa、id_rsa.pub两个文件,此时再其中一台服务器上该目录下新建authorized_keys;原文链接:https://blog.csdn.net/haiziccc/article/details/97611202。3.将三台机器的id_rsa.pub文件内容全部复制到authorized_keys中;4.将该文件分发到另外两台服务器 /root/.ssh目录下;1. 在三台机器上分别执行ssh-keygen;5.测试ssh连接;
2025-04-12 16:21:10
135
原创 第二十:mysql——Undo Log、Redo Log和Binlog
当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据版本是怎样的,从而让用户能够读取到当前事务操作之前的数据【快照读】。其中事务ID每次递增,回滚指针第一次如果是insert语句的话,回滚指针为NULL,第二次update之后的undo log的回滚指针就会指向刚刚那一条undo log日志,依次类推,就会形成一条undo log的回滚链,方便找到该条记录的历史版本。redo log 物理日志 因为mysql最终是保存在数据页中的,物理日志记录的就是数据页的变更。
2025-04-07 23:03:23
494
原创 第十九:b+树和b-树
B+ 树:与 B 树不同,B+ 树的所有数据都存储在叶节点中,非叶节点只存储键值,并且起到索引作用。数据存储集中在叶节点:B+ 树的数据集中在叶节点,不会占用内部节点的存储空间,这使得 B+ 树的叶节点可以存储更多的数据,减少磁盘 I/O 操作。B+树的叶子节点存储数据,而非叶子节点只存储指针,不存储数据。:数据存储在叶节点,内部节点仅存储键值,叶节点通过链表连接,支持高效的范围查询和较少的磁盘 I/O。一致性更高:由于 B+ 树非叶节点不存储数据,只存储键值,它们的高度更低,减少了搜索的复杂度。
2025-04-07 19:26:04
984
原创 第十八:GC 垃圾回收
垃圾回收器从根对象(如全局变量和活跃的栈帧中的变量)开始,将它们标记为灰色。然后,它遍历这些根对象,将它们引用的对象标记为灰色或黑色,直到没有更多的灰色对象为止。在这个过程中,所有可达的对象都被标记为黑色,而白色对象则被视为垃圾并回收。在垃圾回收过程中,为了防止程序执行与垃圾回收冲突的操作,Go的垃圾回收器会暂停整个程序(STW)。这意味着在垃圾回收期间,所有的goroutine都会被阻塞,直到垃圾回收完成。:活跃的,可达的,但其引用可能尚未全部被检查。:活跃的,可达的,且已被标记。函数强制触发垃圾回收。
2025-04-07 18:46:21
484
原创 第十七:堆和栈的应用
一种先进后出的数据结构如:堆排序。先进先出的结构堆由开发人员分配和释放, 若开发人员不释放,程序结束时由 OS 回收,分配方式类似于链表。参考如下代码// C 中用 malloc() 函数申请//输出:00000000003BA0C0// 用 free() 函数释放free(p1);// C++ 中用 new 运算符申请//输出:00000000003BA0C0// 用 delete 运算符释放。
2025-04-07 18:32:44
367
原创 第十五:使用Air实现Go程序实时热重载
怎样才能在基于gin框架开发时实现实时加载功能呢?像这种烦恼肯定不会只是你一个人的烦恼,所以我报着肯定有现成轮子的心态开始了全网大搜索。Air。彩色日志输出自定义构建或二进制命令支持忽略子目录启动后支持监听新目录更好的构建过程。
2025-03-27 16:07:24
467
原创 第十四: jwt token ,refresh token(二)
ErrorUserNotLogin = errors.New("当前⽤用户未登录")中间件 Middlewears。gin框架使⽤用jwt。
2025-03-27 15:31:36
205
原创 第十三:jwt的应用 token ,refresh token
我们需要定制自己的需求来决定JWT中保存哪些数据,比如我们规定在JWT中要存储username信息,那么我们就定义一个MyClaims// CustomClaims 自定义声明类型 并内嵌jwt.RegisteredClaims// jwt包自带的jwt.RegisteredClaims只包含了官方字段// 假设我们这里需要额外记录一个username字段,所以要自定义结构体// 如果想要保存更多信息,都可以添加到这个结构体中// 可根据需要自行添加字段。
2025-03-27 15:18:49
281
原创 第十一:雪花算法 snow_id
案例代码:分布式ID⽣生成器器分布式ID的特点全局唯⼀一性:不不能出现有重复的ID标识,这是基本要求。递增性:确保⽣生成ID对于⽤用户或业务是递增的。⾼高可⽤用性:确保任何时候都能⽣生成正确的ID。⾼高性能性:在⾼高并发的环境下依然表现良好。不不仅仅是⽤用于⽤用户ID,实际互联⽹网中有很多场景需要能够⽣生成类似MySQL⾃自增ID这样不不断增⼤大,同时⼜又不不会重复的id。以⽀支持业务中的⾼高并发场景。⽐比较典型的场景有:电商促销时短时间内会有⼤大量量的订单涌⼊入到系统,⽐比如每秒10
2025-03-24 18:45:58
213
原创 第十:Go语言标准库flag基本使用/切换目录的config.yaml
有以下两种常用的定义命令行flag参数的方法。//定义命令行参数方式1flag.StringVar(&name, "name", "张三", "姓名")flag.IntVar(&age, "age", 18, "年龄")flag.BoolVar(&married, "married", false, "婚否")flag.DurationVar(&delay, "d", 0, "延迟的时间间隔")//解析命令行参数//返回命令行参数后的其他参数//返回命令行参数后的其他参数个数。
2025-03-24 15:52:23
561
原创 第九:gin框架默认的日志并配置日志归档 使用zap
本文介绍了在基于gin框架开发的项目中如何配置并使用zap来接收并记录gin框架默认的日志和如何配置日志归档。我们在基于gin框架开发项目时通常都会选择使用专业的日志库来记录项目中的日志,go语言常用的日志库有zaplogrus等。网上也有很多类似的教程,我之前也翻译过一篇。但是我们该如何在日志中记录gin框架本身输出的那些日志呢?
2025-03-20 19:37:52
509
原创 第八:在Go语言项目中使用Zap日志库 / viper 调用
能够将事件记录到文件中,而不是应用程序控制台。日志切割-能够根据文件大小、时间或间隔等来切割日志文件。支持不同的日志级别。例如INFO,DEBUG,ERROR等。能够打印基本信息,如调用文件/函数名和行号,日志时间等。
2025-03-20 19:34:27
831
原创 第六:go 操作 redis-go
Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制、持久化和客户端分片等特性,我们可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。
2025-03-20 14:54:28
1114
原创 第五: redis 安装 / find 查找目录
mac brew 安装 redis要在Mac上使用Homebrew安装Redis,你需要先安装Homebrew包管理器。如果你还没有安装Homebrew,可以通过以下步骤进行安装。
2025-03-20 14:17:32
316
原创 第四节:sqlx库使用指南
在项目中我们通常可能会使用连接MySQL数据库。sqlx可以认为是Go语言内置的超集,它在优秀的内置基础上提供了一组扩展。这些扩展中除了大家常用来查询的和外还有很多其他强大的功能。
2025-03-19 19:27:02
981
原创 第三:go 操作mysql
客户端对SQL语句进行占位符替换得到完整的SQL语句。客户端发送完整SQL语句到MySQL服务端MySQL服务端执行完整的SQL语句并将结果返回给客户端。把SQL语句分成两部分,命令部分与数据部分。先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预处理。然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换。MySQL服务端执行完整的SQL语句并将结果返回给客户端。事务:一个最小的不可再分的工作单元;
2025-03-19 19:24:38
1390
原创 第二十一:Go标准库Context
给一个函数方法传递Context的时候,不要传递nil,如果不知道传递什么,就使用context.TODO()Context的Value相关方法应该传递请求域的必要数据,不应该用于传递可选参数。以Context作为参数的函数方法,应该把Context作为第一个参数。对服务器传入的请求应该创建上下文,而对服务器的传出调用应该接受上下文。当一个上下文被取消时,它派生的所有上下文也被取消。Context是线程安全的,可以放心的在多个goroutine中传递。是一个接口,该接口定义了四个需要实现的方法。
2025-03-16 17:12:19
529
原创 第二十:并发与安全锁、互斥锁 与 读写互斥锁
在Go语言中,可以使用互斥锁(mutex)来实现协程之间的数据共享和同步。互斥锁是一种机制,用于保护共享资源的访问,防止多个协程同时修改数据。总结:Go语言协程可以通过通道进行通信,通过互斥锁进行数据共享和同步。这些机制使得并发编程变得简单且高效,适用于各种并发场景。通过互斥锁的加锁和解锁操作,可以确保同一时间只有一个协程能够修改共享资源,从而实现数据的安全共享和同步。
2025-03-13 13:11:50
232
原创 第十九:channel 的使用 select 多路复用
在Go语言中,可以使用互斥锁(mutex)来实现协程之间的数据共享和同步。互斥锁是一种机制,用于保护共享资源的访问,防止多个协程同时修改数据。总结:Go语言协程可以通过通道进行通信,通过互斥锁进行数据共享和同步。通过互斥锁的加锁和解锁操作,可以确保同一时间只有一个协程能够修改共享资源,从而实现数据的安全共享和同步。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。Go 语言中的通道(channel)是一种特殊的类型。声明的通道类型变量需要使用内置的。
2025-03-12 19:34:13
324
原创 第十七:go 反射
reflect包在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和两部分组成,并且reflect包提供了和两个函数来获取任意对象的Value和Type。TypeOf在Go语言中,使用函数可以获得任意值的类型对象(reflect.Type),程序通过类型对象可以访问任意值的类型信息。注意:Go语言的反射中像数组、切片、Map、指针等类型的变量,.Name()空。ValueOf返回的是类型,其中包含了原始值的值信息。
2025-03-11 18:03:24
899
原创 第十六:接口定义,接口变量,空接口
/定义一个类型,一个抽象的类型,只要实现了say()这个方法的类型都可以称为sayer类型。// 不管传进来的是什么,都要打 Ta ,就要执行Ta的 say() 方法。只要实现了接口中规定的所有方法,那么我们就称它实现了这个接口。t := tiger{name: "老虎的测试"}// 打的函数,上面所有方法 都要实现 da 的这个方法。p := pig{name: "猪的测试"}// 接口不管你是什么类型,它只管你要实现什么方法。c := cat{name: "测试"},如有写操作的接口叫。
2025-03-11 17:27:56
416
原创 第十五章:go package 包的管理
作为包名,那么这个包的引入方式就称为匿名引入。一个包被匿名引入的目的主要是为了加载这个包,从而使得这个包中的资源得以初始化。需要注意的是,Go语言中不允许引入包却不在代码中使用这个包的内容,如果引入了未使用的包则会触发编译错误。packagename:包名,可以不与文件夹的名称一致,不能包含。匿名引入的包与其他方式导入的包一样都会被编译到可执行文件中。如果引入一个包的时候为其设置了一个特殊。符号,最好与其实现的功能相对应。package:声明包的关键字。函数将被执行并且仅执行一遍。
2025-03-10 23:28:54
225
原创 第十三章:go 语言定义一个接收者方法
方法和接收者注意:方法一定是属于某一个类型的 《重点》Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做。接收者的概念就类似于其他语言中的this或者self。其中,官方建议使用接收者类型名称首字母的小写,而不是selfthis之类的命名。例如,Person类型的接收者变量应该命名为pConnector类型的接收者变量应该命名为c等。方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。
2025-03-10 18:28:31
335
原创 第十二章:结构体定义和结构体实例化
age int// 创建指针类型的结构体第二种方式:p3.city = "湖南"p3.name = "李磊"name: "p4的名字",age: 9,city: "广东",
2025-03-10 17:51:37
149
php精典雅php精典php精典php精典
2009-04-17
JS文件开发区 JS文件开发JS文件开发
2009-04-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人