自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 框架、云原生、微服务的基本概念

单一架构是一种将所有功能集成到一个单一的、大型的应用程序中的架构方式。这种架构通常是一个独立的进程,包含了应用的所有模块和功能。垂直架构是将应用按照功能模块划分为多个独立的子系统,每个子系统负责特定的业务功能,但仍然部署在同一台服务器上。这种架构是单一架构的扩展,通过模块化解决了部分可维护性问题。分布式架构是将应用拆分为多个独立的服务,每个服务负责特定的业务功能,并且可以独立部署在不同的服务器或容器中。服务之间通过网络通信(如HTTP、gRPC、消息队列等)进行协作。

2025-03-10 17:06:14 1060

原创 Gorm中的First()、Create()、Update()、Delete()的错误处理

err 的值取决于插入操作失败的具体原因。常见的错误类型包括数据库约束违反、数据类型不匹配、连接问题等。你可以通过检查错误消息或使用 GORM 提供的工具(如 gorm.IsRecordNotFoundError)来处理这些错误。如果删除条件未匹配到任何记录,result2.Error 的值是 nil。如果需要判断是否删除了数据,可以通过检查 result2.RowsAffected 是否为 0 来实现。

2025-03-02 19:25:21 774

原创 Redis过期数据处理

Redis 默认使用键的过期时间来进行数据过期处理,但也可以通过自定义过期策略来实现对过期数据的恢复。将过期键和其对应的值发布到一个频道中。使用一个订阅者来订阅这个频道,当有新的过期键被发布时,订阅者会接收到通知。在订阅者中实现自定义的逻辑来处理已过期的键,并执行相应的操作。

2025-02-23 21:56:36 987

原创 Redis过期机制

以上函数中的rdb.Set(rdb.Context(), key, data, cacheDuration).Err()中的 cacheDuration一旦被设置,是不是就意味着,当数据在内存中存储超过这个时间,就会被删除,redis缓存中将不在有该数据了?是的,在 Redis 中,cacheDuration 设置为 24 * time.Hour 表示缓存数据的过期时间为 24 小时。

2025-02-16 21:10:17 509

原创 Go内存逃逸

在Go语言中,Go 程序会在 2 个地方为变量分配内存,一个是全局的堆(heap)空间用来动态分配内存,另一个是每个 goroutine 的栈(stack)空间。(Escape Analysis) 是指由编译器决定内存分配的位置,不需要程序员指定,由编译器完成,作用于编译阶段。

2025-02-06 14:54:12 605

原创 gorm中关于事务的一些东西

tx.Rollback() 后,事务会自动结束,事务对象tx 不再可用。回滚操作会撤销事务中所有未提交的更改,并将数据库状态恢复到事务开始之前的状态。通过正确使用tx.Rollback() 和 tx.Commit(),可以确保事务的正确管理和错误处理,从而保证数据的一致性和完整性。查询失败需要回滚:如果查询操作失败,应该调用 tx.Rollback() 回滚事务,以确保事务的完整性。事务未结束:如果查询失败后不调用 tx.Rollback(),事务仍然处于打开状态,但后续操作无法继续执行。

2025-01-25 21:50:36 1051

原创 路径参数和查询参数分别是什么

在Web开发中,路径参数(PathParameter)和查询参数(QueryParameter)是两种常见的从客户端传递数据到服务器的方式。它们的主要区别在于参数的传递方式和用途。

2025-01-19 19:45:28 428

原创 不可重复读和读脏数据的区别

不可重复读(Non-repeatable Read)和读脏数据(Dirty Read)是数据库事务隔离级别中常见的并发问题,它们描述了在并发事务的情况下,可能出现的数据不一致性。发生场景:事务1在修改数据后尚未提交,事务2读取了事务1修改的数据。事务1如果在提交前回滚,那么事务2读取的数据就变成了“脏数据”——因为它读取的是一个未提交的修改。:事务在两次读取同一数据时,数据的值发生了变化(即数据被其他事务修改了)。数据一致性受到影响,但不同于脏读,因为事务1读取的数据是已提交的数据。

2025-01-13 10:01:05 359

原创 数据库中的并发控制

一级封锁协议:不丢失修改,但不能保证不读脏数据和可重复读。二级封锁协议:可以避免脏读,并且不丢失修改,但不能保证可重复读。三级封锁协议:可以保证不丢失修改、不读脏数据并且保证可重复读。事务1获取数据 X 的锁,并开始读取数据。事务2修改了 X,但事务1仍然保持对 X 的锁,直到事务1完成并提交。事务1在整个过程中读取到的数据始终一致,无论其他事务是否对数据进行了修改。

2025-01-05 20:15:24 1054

原创 INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN这四个怎么在gorm中使用

在 GORM 中,JOIN 操作是通过 Joins 方法实现的,而不同类型的 JOIN(如 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN)可以通过特定的 SQL 语法来表示。解释:RIGHT JOIN 返回 orders 表中的所有记录,即使 users 表中没有匹配的 id,未匹配的用户信息用 NULL 填充。解释:Raw 允许你直接执行原始 SQL 查询,因此可以通过 FULL JOIN 语法来获取所有用户和订单,包括未匹配的记录。

2024-12-30 22:27:46 593

原创 http.ServeMux多路复用器的设置

简而言之,http.DefaultServeMux.ServeHTTP(w, r) 允许你的自定义 http.Handler 与全局的路由规则协同工作,确保所有的路由设置都能被正确地应用到传入的请求上。

2024-12-08 18:04:54 1053

原创 处理HTTP请求的两种常见方式:多个处理器(Handler)、多个处理函数(HandleFunc),两者有什么区别

在Go语言中,处理HTTP请求的两种常见方式是使用http.Handler接口和http.HandleFunc函数。它们都用于定义如何处理HTTP请求,但它们之间有一些关键的区别:1.http.Handler接口:2.http.HandleFunc函数:区别总结:http.Handler接口的优势在于它的灵活性和能够去封装状态和行为。以下是一些具体的例子来说明http.Handler接口的优势:1. 封装请求处理逻辑和状态使用http.Handler接口,你可以创建一个结构体来封装请求处理所需的状态

2024-12-01 20:43:03 1027

原创 Go无缓冲通道(同步通道)

goroutine1先执行,如果想要再次发送(写入)数据的话,必须等待goroutine2将channel中的数据取出来(读取)之后,才能再次发送。goroutine2先执行,如果想要再次接收数据的话,必须等待goroutine1再次向channel中写入数据之后,才能再次接收。同理,因为当程序执行到 v :=

2024-11-24 11:26:59 482

原创 简单分析数据被序列化后的内容

JSON 字符串是以UTF-8 编码的字节数组表示的。Go 的[]byte类型可以帮助我们逐个访问 JSON 字符串中的每个字节。通过解析字节数组,我们可以看到 JSON 的每个字符(包括汉字)如何被编码和存储。这行代码使用fmt.Printf格式化输出字节数组内容,按索引字节值字符表示三列对齐显示。通过 %-10d和 %-15q的格式控制,可以确保输出整齐,便于阅读和分析。%q格式化符号特别适合显示字符串和字符的字面值,同时处理 Unicode 和转义字符。

2024-11-17 11:44:11 690

原创 go语言中反射机制(3种使用场景)

JSON 解析:利用反射实现通用的结构体解析函数,动态处理不同类型的 JSON 数据。ORM 框架:使用反射将数据库结果映射到结构体字段,实现通用的数据库查询。接口适配:动态检查和调用方法,实现灵活的接口处理。这三个场景充分展示了 Go 语言中反射的强大功能,但同时也提醒我们反射可能带来的性能开销与复杂性,因此在实际开发中应当谨慎使用。

2024-11-17 11:15:31 690

原创 go语言中的反射机制(基础)

在实际使用中,如果想要通过反射修改变量的值,通常需要传递变量的指针。原因是 Go 语言中的函数参数是值传递,如果传递的是一个普通变量(如 int 或 string),反射操作无法直接修改原始值。当我们使用 reflect.ValueOf() 获取某个变量的 reflect.Value 时,可以使用 Kind() 方法来判断它的类型种类。在 Go 语言的反射机制中,reflect.Ptr 是一个常量,用于表示变量的。

2024-11-17 10:59:07 830

原创 闭包的知识

闭包是带有环境变量引用的函数,可以保存和使用创建时的上下文数据。这种特性使得闭包在需要记住函数状态、创建自定义函数工厂、计数器等场景中非常有用。闭包常用于创建不同配置的函数。我们可以在闭包中定义一部分行为,让函数调用者提供另一部分参数,从而实现定制化的功能。// filter 函数接收一个整数切片和一个闭包函数,用于过滤符合条件的元素if test(num) { // 调用闭包判断条件// 传递闭包函数来筛选出偶数})

2024-11-10 20:02:06 992

原创 redis的持久化

Redis 的持久化机制主要是通过内部的方式来实现的,而不是直接将数据写入到外部数据库(如 MySQL)。下面将详细介绍 Redis 的默认持久化机制,以及如何通过编程的方式将 Redis 数据手动同步到 MySQL。

2024-11-03 23:17:50 1214

原创 sql语句中的Group By 分组查询

分组查询的主要目的是对数据进行分类汇总,以便从数据集中提取有意义的统计信息和分析结果。在 SQL 中,分组查询通常通过 GROUP BY 子句来实现,将数据按照某个字段(或字段组合)进行分组,然后对每个分组应用聚合函数(如 SUM()、AVG()、COUNT()、MAX()、MIN() 等)来计算统计值。

2024-10-26 16:28:39 2864

原创 输入缓冲区和换行符

输入流和输入缓冲区可以视为同一个东西的不同描述。当数据进入输入缓冲区时,我们说数据存在于输入流中,而程序通过读取输入缓冲区来获得用户的输入。在使用 fmt.Scan 时,换行符会被当作空白字符处理,并且会从输入流中消费掉,不会继续存在于输入流中。因此,在下一次读取时,换行符已经不再存在。

2024-10-24 23:35:18 905

原创 使用bufio.NewReader(os.Stdin)从标准输入(通常是键盘输入)读取数据

os.Stdin 代表标准输入,用于接收来自终端或命令行的输入。bufio.NewReader(os.Stdin) 创建了一个带有缓冲区的读取器,使读取数据更高效。reader.ReadString(‘\n’) 阻塞等待用户输入,直到按下回车键,然后返回输入的整行文本。os.Exit() 的参数用于指定程序的退出状态码,0 表示正常退出,非 0 表示异常退出。状态码可以用来区分不同的错误类型,是操作系统和脚本判断程序执行结果的依据。

2024-10-24 23:27:38 828

原创 go语言中的Scan()和Scanln()输入函数

出现连续输出的问题是因为 fmt.Scan 在输入格式错误时,未能正确处理错误并清除输入缓冲区。通过添加错误处理和清除输入缓冲区的操作,可以避免这种情况的发生。

2024-10-24 23:22:00 810

原创 go语言中的Scanf()输入函数

fmt.Scanf 在读取数据时,换行符会导致输入解析中断,从而无法继续读取剩余的数据。fmt.Scanln 和 bufio.Reader 可以更好地处理换行符,以读取用户的完整输入。

2024-10-24 23:12:58 1183

原创 Go语言中三个输入函数(scanf,scan,scanln)的区别

Scanf 更加灵活,可以指定格式,但要求输入格式必须匹配。Scan 和 Scanln 更适合简单的输入读取,Scanln 还会检查是否有多余的输入。在实际应用中,根据需要选择适当的函数来读取用户输入。Scanf:根据格式化字符串解析输入,换行符如果不影响解析会被忽略。Scan:将换行符视为空白字符,会继续读取更多数据,直到满足所有变量的赋值要求。Scanln:以换行符作为输入结束标志,如果在所有参数读取完毕后还有多余输入(除了换行符),会返回错误。

2024-10-24 23:00:31 1112

原创 go语言中CreatedAt时间格式的处理

在 GORM 中,gorm.Model 中的 CreatedAt 字段是 time.Time 类型。为了将它转换成年月日时分秒的格式,可以使用 Go 的时间格式化函数 Format,它可以将 time.Time 类型的时间格式化为指定的字符串形式。Go 使用特定的参考时间来指定格式:2006-01-02 15:04:05。你可以根据需要的时间格式调整该模板。

2024-10-20 19:22:54 887 1

原创 计算机网络物理层知识点总结

2. IEEE 802.11:无线局域网标准,定义了无线网络设备的工作方式,包括IEEE 802.11b(11Mbps)、IEEE 802.11g(54Mbps)、IEEE 802.11n(300Mbps)、IEEE 802.11ac(1Gbps)等。光纤(Optical Fiber):光纤通过光波在玻璃纤维中传递信号,具备极高的传输速率和极低的信号衰减,常用于长距离、高速率的通信。2. 信号编码:为了适应物理媒介的特性,物理层负责根据不同的传输媒介,将数据进行适当的编码。

2024-08-04 21:58:37 525 1

原创 计算机网络概述

计算机网络的精确定义并未统一计算机网络的最简单的定义是: 一些互相连接的、 自治的计算机的集合。互连是指计算机之间可以通过有线或无线的方式进行数据通信;自治是指独立的计算机,它有自己的硬件和软件,可以单独运行使用;集合是指至少需要两台计算机;计算机网络的较好的定义是:计算机网络主要是由一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某-特定目的(例如,传送数据或视频信号)。这些可编程的硬件能够用来传送多种不同类型的数据,并能支持广泛的和日益增长的应用。

2024-07-21 20:59:35 1194

原创 Go语言协程通道使用问题

总之,虽然 select 和 time.After 的模式简单直接,但在需要真正取消操作或在多个 goroutine 间协调的场景中,使用 context 包是更好的选择。在使用 context 的版本中,如果超时发生,操作会被主动取消,避免了资源浪费。Context 包的引入大大简化了在 Go 程序中处理取消、超时和跨调用边界传值的复杂性,是构建健壮的并发和分布式系统的重要工具。是实现优雅取消和超时处理的关键机制,它允许 Go 程序以非阻塞的方式响应取消信号,从而编写出更加健壮和响应式的并发代码。

2024-07-11 15:44:45 1402 2

原创 go mod

这两个文件共同作用,既简化了开发者管理依赖的工作,又确保了项目构建时的稳定性和安全性。都是为了确保项目的依赖管理和版本控制一致,简化开发和部署过程。是 Go 语言用来管理依赖和版本的工具。当你编译或运行项目时,Go 会自动下载所需的依赖并添加到。文件,包含模块路径和 Go 版本。假设你要创建一个新的项目并使用。在你的 Go 文件中使用。文件,移除未使用的依赖。

2024-06-24 21:41:36 1016 1

原创 Go函数参数传递到底是值传递还是引用传递

因为slice作为参数时本质是传递的指针,上面证明了指针也是值传递,所以参数为slic e也是值传递,指针指向的是同一个变量,函数内对形参的修改,会修改原内容数据单纯的从sice这个结构体看,我们可以通过modity修改存储元素的内容,但是永远修改不了len和cap,因为他们只是一个拷贝,如果要修改,那就要传递&slice作为参数才可以。在C++中,传引用肯定是可以修改原内容数据的,在Go语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数是引用类型。引用类型和引用传递是2个概念,切记!

2024-06-02 19:12:55 545 1

原创 Go语言中切片和数组的关系

切片是基于数组实现的,它的底层是数组,可以理解为对底层数组的抽象。在 Go 语言中,切片确实是一个结构体,它包含指向底层数组的指针、切片的长度和切片的容量这三个字段。当你将一个切片赋值给另一个切片时,它们共享相同的底层数组,因此它们的指针、长度和容量都会相同。slice占用24个字节array:指向底层数组的指针,占用8个字节len:切片的长度,占用8个字节cap:切片的容量,cap总是大于等于len的,占用8个字节slice有4种初始化方式。

2024-06-02 18:25:19 1097

原创 Map底层的一些东西

使用range多次遍历map时输出的key和vaue的顺序可能不同。这是Go语言的设计者们有意为之,旨在提示开发者们,Co底层实现并不保证map遍历顺序稳定,请大家不要依赖range遍历结果顺序主要原因有2点.map在遍历时,并不是从固定的0号bucket开始遍历的,每次遍历,都会从一个随机值序号的bucket,再从其中随机的cell开始遍历·map遍历时,是按序遍历bucket,同时按需遍历bucket中和其overflow bucket中的cell。

2024-05-04 16:09:47 1256

原创 Map-CRUD

(1) map集合在使用前一定要make(2) map的key-value是无序的(3) key是不可以重复的,如果遇到重复,后一个value会替换前一个value(4) value可以重复的(5) key通常为int、string类型, value通常为数字(整数、浮点数)、string、map、结构体,还可以是接口、结构体、数组(6) key:不可以是 slice、 map、function。

2024-05-04 15:12:01 285

原创 003.向Gitee上传代码

主要填一下仓库名称,(如果希望别人知道或者提醒自己该仓库是干什么的,就可以再填一下仓库介绍),对于选择开源还是私有,取决于你是个人开发,还是公司内部,以及自己课公司是否想公开。然后点击创建即可。至于后面三个选项(初始化仓库,设置模板,选择分支模型)目前我自己还没用到,就没有研究了。成功创建后的页面。

2024-04-18 15:46:20 1764 1

原创 tcp和http的区别

这个过程称为数据的分段。每个层级都定义了特定的协议和功能,不同层级之间通过接口进行通信,上层的数据被封装在下层的数据包中传输。OSI模型提供了一种通用的框架,帮助人们理解和设计计算机网络,但实际上,许多网络协议并不严格遵循OSI模型,而是基于TCP/IP协议栈。通过这种三步确认过程,TCP 协议确保了连接的可靠性和数据的顺序性,从而可以在网络中安全可靠地传输数据。简而言之,TCP提供了底层的数据传输服务,而HTTP则建立在TCP之上,用于特定的应用场景,如Web浏览器与服务器之间的通信。

2024-04-14 14:04:34 2124 1

原创 用MySQL,Java以及javafx实现学生信息管理系统

其实整个管理系统判断,数据在数据库中是否存在的思维逻辑都一样,都是在按钮的绑定事件中先调用相关的服务类,服务类再调用工具类中的相关查询方法,然后再将查询结果一步一步返回到调用处,然后根据返回的结果,进行下一步的操作。例如:if(result.equals("学生")) //result是单选按钮返回的值,判断是学生登录还是教师登录//system.out.println("登录成功");

2023-12-20 18:10:13 1237

原创 对MySQL中事务的简单理解

这意味着,即使其他事务对数据进行了修改,Repeatable Read 隔离级别下的事务也只会读取到事务开始时的一致性数据快照,而不会受到其他事务的影响。这意味着每个事务都会独立地执行,而不会与其他事务并发执行。并发事务插入数据:当一个事务在读取一个数据集合(通过范围查询)时,而另一个事务在这个范围内插入了新的数据,导致第二次读取时返回的数据集合与第一次读取时不一致。:在"读提交"级别下,数据库系统会使用短暂的读锁来确保事务读取的数据是已经提交的,这样可以防止其他事务在数据被读取的时候对数据进行修改。

2023-12-18 21:36:04 923 1

原创 git笔记(2)

通过git,开发者可以记录每一次代码的变动,并可以在需要的时候进行版本回退或者将代码合并到其他分支上。总之,分布式版本控制系统相对于集中式系统更加灵活和高效,允许开发者在本地独立地进行工作,并且具有更好的分支管理能力。无论采用何种处理方式,集中式版本控制系统的中央服务器都会记录每个提交的作者、时间戳和具体修改内容,以保证提交的完整性和可追溯性。在集中式版本控制系统中,当两个客户端同时提交同一版本的文件时,中央服务器会根据其具体实现和配置的不同,可能有不同的处理方法。git pull +地址或别名+分支。

2023-10-01 20:31:09 57

原创 git笔记

master 和 fix-hot 在同一个版本的基础上都进行了修改,merge 就是新的覆盖旧的,此时相对基础版本都是新的,git不知道哪个是新,哪个是旧。git config --global user.name " **** " //设置用户名。git config --global user.email " **** " //设置邮件。git merge +分支名 :将填写的分支合并到指针此刻所指向的分支,内容变为修改后的内容。修改其中一个分支版本的内容,其他分支版本内容保持不变。

2023-09-24 21:23:08 98 1

原创 html和css中的部分笔记

在HTML中,form(表单)和按钮之间有密切的关系。form用于创建一个包含输入字段、选择框、按钮等元素的表单,而按钮则负责触发表单的提交、重置或者其他操作。一般而言,form标签包含了表单中的各种元素,例如输入框(input)、下拉框(select)、多选框(checkbox)等等。其中一个重要的元素就是按钮(button),通过按钮可以触发与表单相关的动作。按钮可以通过type属性进行分类,常见的type属性值有:1. submit:用于提交表单数据。

2023-09-17 17:27:37 58 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除