自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 初识MVC

今天第一次学MVC,拿到一个练手项目。现在来记录一下学习过程。项目的背景就是个学生管理系统。我只做后端。从大的来说MVC将应用程序分为三个主要组件(部分):模型(Model)是应用程序的主要部分,包含了业务逻辑和数据。model往往代表了对象和数据库之间的数据连接。这里就对应下面的Service,dao。视图(View)是model的可视化表示。可以是图形用户界面(GUI),而在 Web应用中,view通常是指渲染数据的 HTML。控制器(Controller)是连接model和view的部分。

2024-04-29 21:42:20 530

原创 java算法day7

Java中的字符串是不可变的,这意味着一旦一个字符串被创建,其内容就不能改变。在性能敏感的应用中,通常推荐使用StringBuilder,除非你需要在多线程环境中操作字符串。这是通过内部机制实现的,以便这两种类型的对象可以在运行时根据需要增加存储容量,以容纳更多的字符。:新的容量通常是当前容量的两倍加上2,但这可能因JVM的实现而异。如果这个新计算的容量还不足以容纳新增的数据,那么容量会增加到必要的大小以适应新增的数据。思路:遍历字符串,是数字就把number字符串插入,不是数字就把遍历的字符给插入。

2024-04-27 17:33:03 1080 1

原创 java算法day6

当求和结果过大的时候,right应该往右移动一格,这样结果就能减小。后面两个数组,也是二重for循环计算后两个数组中相加的所有结果,在这个过程中,取相加结果的负数,去哈希表中找有没有满足相加为0的组合。所以对于i的判重:必须要i>0,即在第一格的时候不用判重,所以就可以放心的写,nums[i]==nums[i-1]的时候,就可以continue进入下一轮。left的判重,left和left+1位置的元素比较,这样比较简单,主要也是担心数组越界的问题,所以left判重就要多一个条件,left

2024-04-27 14:54:33 902 1

原创 java算法day5

3.开始遍历数组,遍历的时候进行其相加的另一个值的计算,然后立即用hash进行查找,(而且题目并不限制答案中谁先谁后)。由于 String 在Java中是不可变的(immutable),任何修改 String 的操作都会生成一个新的 String 对象,而不是修改原始对象。:ArrayList 的容量可以根据需要自动增加,当添加元素使得内部数组容量不足时,ArrayList 会自动创建一个新的更大的数组,并将旧数组的内容复制到新数组中。想到统计字符串每个字符的个数,那想到的就是遍历字符串进行累加。

2024-04-24 21:44:15 729

原创 java算法day4

如果让指针从链表头部一直往前走并统计步数k,那么所有走到链表入口节点时的步数是k=a+nb,即先走a步到入口节点。但是我们不知道这个到底是多少,那么此时仍然是双指针法,考虑构建一个指针,此指针需要有这样的性质:和slow同时往前走a步后,两者在入口节点重合。之后,fast和slow同时走,两个都是每次只走一步。3.当fast指针走到f = a步时,slow指针就走到了s = a+nb,此时fast和slow在环入口重合。只要两个有相交,A,B同时往后走,A到底(null)后指回B,B到底后指回A。

2024-04-21 19:06:47 649

原创 java算法day3

此时想到cur.next = pre ,那不就完成了next后驱的翻转,但是还有个问题,如果直接cur.next = pre,那就找不到后面的结点,无法继续遍历修改链表了。所以这里再加一个tmp用于存往后遍历的位置,这个tmp的值显然就是cur的后驱:cur.next。cur指针进行判断,如果不是cur指向的不是目标元素,双方一起往后走。而pre如果是cur指目标元素后才后移,如果不是目标元素,就一起后移。前两个就已经改完了,那么现在就要到下一轮,显然temp要变到node1的位置,然后开启下一轮的逻辑。

2024-04-21 13:53:22 723

原创 java算法day2

解法仍然是二分**这个题仍然是递增,但是和上一题的区别就在于这个题有重复数字。上一题是没有的。**这个题如果还用上面那个题的思维,那么会出现一个情况,虽然插入后得到的数组看上去没问题,但实际上这个插入位置不一定是题目想要的第一个位置和最后一个位置。看下面这个图。用上一个题的思路二分下来就会有这样的问题,这个指向的位置,不一定是边界。怎么办:思路:这里我肯定是想继续往左边找,想办法找到左边界。我们只需改在。

2024-04-19 22:59:33 1110

原创 java算法day1

一旦求的和大于了target,此时就进入到了内部的滑动窗口的收缩,这个内部的滑动窗口用while来进行判断维护滑动窗口是最好的,由于求和值已经大于了target,此时就该先进行长度值的求解了,所以是先进行长度值求解,求解之后开始进行滑动窗口的收缩,收缩操作是左边slow来进行窗口大小的减小。解法:双指针,这个题的关键就在于发现一个规律,在去平方的情况下,数组中的元素一定是两边大,中间小。最后slow停留的位置,在完成最后一个元素的构造时,还会slow++,所以最后slow停在的位置就是结果值,不用去+1。

2024-04-17 20:21:33 662

原创 认证模式~

在Web应用中,Token是一个代表系统中某个实体(通常是用户会话)的加密字符串,用于在客户端和服务器间安全传递信息。Token可以存储所需的任何数据,但为了减少客户端到服务器的往返次数,它通常包含足够的信息来标识用户或会话,以及签名或其他验证数据,以确保Token的真实性和完整性。

2024-02-26 23:11:26 1230

原创 snowflake雪花算法

这个字符串代表的是Go的诞生时间(2006年1月2日15时4分5秒),你可以通过改变这个字符串中的日期和时间部分来定义自己的时间格式。雪花算法(Snowflake Algorithm)之所以适用于分布式系统,并能够被称为分布式ID生成算法,主要是因为它考虑到了分布式系统中不同节点独立生成ID的需求,通过结构化的ID格式和算法设计,确保了每个节点生成的ID既唯一又有序。这个我要解读一下,这个是go标准库的函数,用于解析时间字符串的函数,它的作用是将一个指定格式的字符串解析位time.Time类型的时间对象。

2024-02-24 22:54:26 376

原创 web通用脚手架2

这个模板的基本架构和1是一样的,唯一的一点区别就是在设计上进行了优化。因为在一盘的场景下,,而且就算改成用结构体表示,配置项和结构体还是可以完成数据更新的同步。实现数据更新同步的思想:1.仍然使用watch监控配置文件。2.然后利用里面的那个钩子函数。一旦配置文件发生修改,就立即反序列化到这个全局结构体。这样就完成了结构体的不断更新。反序列化要注意:结构体和配置文件直接要完成一个映射关系,这种映射关系一般是使用tag标签来实现。

2024-02-24 04:09:30 644

原创 较通用web脚手架模板搭建

从这里开始就接触到以后写项目的思维了。做一个web开发,那就要层次分明,要有个实现的规划,这通常也是有一个较为通用的模板的。总的来说:不同的层次有不同的模块,每个模块有必须实现的功能,我们要做的就是填充每个模块。也就是每个模块就相当于给你需求,然后你用代码去把这些需求给实现,这就是做项目的过程。

2024-02-24 02:10:20 1085

原创 gin源码实战 day2

Use 方法是 Gin 框架提供的一种方便的方式,用于为整个 Web 应用添加全局中间件。不仅可以对单个路由,还可以对路由组使用。极其方便。

2024-02-20 04:49:05 1160

原创 gin源码实战 day1

nil:表示该节点不直接关联处理函数,可能是因为它是一个参数化的路径部分,或者是未到达叶节点的中间节点。*<数字>:代表与节点关联的处理函数。数字仅为示例,实际上会是指向处理函数的指针。

2024-02-20 01:37:47 1513

原创 go redis

事务的。

2024-02-18 18:18:33 918

原创 gin(结)

<head></head><body></body>跳转到其他地方

2024-02-17 00:30:07 1297

原创 gorm day9(结)

通过使用Select和Omit方法,GORM为开发者提供了灵活的数据操作控制,

2024-02-15 03:36:56 822

原创 gorm day8

连接表可以说一个全功能的模型,支持soft Delete、钩子、更多字段,就根其他模型一样。您可以通过SetupJoinTable指定它,例如:注意:自定义连接表要求外键是复合主键或复合唯一索引ID int"`ID uint// ...// 修改 Person 的 Addresses 字段的连接表为 PersonAddress// PersonAddress 必须定义好所需的外键,否则会报错解读:这段内容解释了在GORM中如何自定义"Many To Many"关系的连接表,

2024-02-14 18:31:00 1188

原创 gorm day7

主键是一个表中的特定列(或一组列),

2024-02-14 05:10:18 1554

原创 gorm day6

SQL注入(SQL Injection)是一种常见的安全漏洞,它允许攻击者在应用程序的数据库查询中插入或“注入”恶意SQL命令。这种攻击可以用来获取、修改、删除数据库中存储的数据,甚至有可能获取到数据库服务器的更多权限。

2024-02-13 04:45:20 805

原创 gorm day5

GORM 提供了灵活的删除操作,允许通过。

2024-02-13 01:15:08 749

原创 gorm day4

代表数据库中的 users 表,假设这个表有很多字段,但在这个例子中只展示了几个字段(ID, Name, Age, Gender)。

2024-02-12 16:40:00 1251

原创 gorm day3

如果相关模型没有定义主键,GORM 将按照模型的第一个字段进行排序。这是 GORM 的一种后备机制,确保 First 和 Last 方法能够在没有明确主键的情况下工作。重点:1、db.First(&user),这里传的是要存储的结构体的地址,然后gorm自动根据user的结构推断出要查询的表。2.db.Model(&User{}),这个就是明确告诉GORM要操作的模型是User,&User{}是一个新的User类型的实例的指针,它用于指定查询的表。

2024-02-11 00:53:18 970

原创 gorm day2

这里说的就是mysql里面的配置函数:举个例子。

2024-02-08 04:04:19 812

原创 算法day12

2.确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。1.我第一次写的时候没有意思到,res切片是引用类型,所以我在函数调用的时候,如果要对res产生影响,那么我就必须要传指针,所以在定义函数的时候我要传的是*[]int,然后传参的时候传的肯定是&res。下面的题目都是涉及二叉树的递归遍历。首先树结点的结构体这个必须要会写,就和c++的实现一样的。

2024-02-06 23:26:30 1093 1

原创 算法day11

堆必须是个完全二叉树,就是这种按序排的,而且中间不能跳。

2024-02-05 19:40:40 1187 1

原创 gorm day1

什么是ORM?对象关系映射(Objection Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库(如mysql数据库)存在的互不匹配现象的计数。简单来说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。什么是Gorm?Gorm就是Go语言的ORM框架。它提供了一种高效的方式来在Go代码和数据库之间进行数据操作和交互。

2024-02-04 02:57:34 886 1

原创 算法day10

回答是不会,因为计算机的计算就是顺序的扫描后缀表达式,它是顺序扫描,根本就不用管括号优先级。接下来细说弹栈操作:从这个图我们可以发现一件事,你遇见的第一个右括号比如这个括号我记为},然后可以发现这个栈顶元素,它必须是这个}相应的{,如果不是或者栈中已经没有左括号了,那就说明字符串s直接无效,并返回False,为了快速判断括号的类型,我们可以使用哈希表存储每一种括号。当我使用下标访问字符串,比如s[i],我得到的是字符串在i位置上的字节,如果字符串包含多字节的UTF-8字符,单个字节可能不代表完整字符。

2024-02-03 17:02:36 706 1

原创 算法day9

入栈操作时,首先获得入栈前的元素的个数,然后将元素入队到队列,再将队列中的前n个元素(即除了心如站的元素之外的全部元素)依次出队并入队到队列,此时队列的前端的元素即为新入栈的元素,且队列的前端和后端分别对应栈顶和栈底。因为你模拟队列,入第一个栈的时候你这个时候进行弹栈输出你得到的序列肯定是反的,所以再来一个栈,去接弹栈的结果,此时第二个栈出栈的效果就很你出队的效果是一样的,顺序都是正的,所以对这第二个栈出栈就达到了队列出队的目的。题目也说了,栈里面的pop,push,size,isempty是合法操作。

2024-02-02 19:44:38 792

原创 golang网络编程day6(结)

刚刚接触网络编程时,我是啥也看不懂,空有计算机网络的知识,这些函数我都不知道有什么用,但是经过理解例子,不断地对这些函数进行学习,和代码地逻辑流程,现在回头再看第一天地实践例子,已经感觉是非常轻松了。这也让我感觉到写博客一方面帮我记忆,写的过程中也记下了思考。下一个板块就是gin框架和grpc的学习了。

2024-02-02 02:37:47 1237

原创 golang网络编程day5

最后总结:创建了两个路由/login和/home,在用户登录成功时,我们通过http.Cookie结构体的Expires属性设置一个长期有效的Cookie,并使用http.SetCookie函数将其添加到响应中,下次用户访问/home时,通过http.Request的Cookie函数,获取Cookie,并检查Cookie的值是否为1,如果是则表示用户已经登录,否则需要显示登录界面。在首页中,我们显示计数器的值,并将其增加1。在addHandler中,我们从请求参数中获取一个值,并将其添加到计数器的值中。

2024-02-01 23:21:15 784 2

原创 算法day8

在go语言中,字符串非常的需要去学习它的在这个语言中的特定。因为之前一直用的c++,但是我在学习go语言的过程中,感受到go的字符串和c++的字符串还是有很多区别的,虽然在做题的算法思想上一样,但是在用法上还是有很多的不同。这里进行了六点go语言的字符串总结:在 Go 语言中,字符串是不可变的字节序列,通常用于表示文本。1.UTF-8 编码:Go 字符串默认使用 UTF-8 编码。这意味着一个字符串可以包含任何 Unicode 字符。2.不可变性:字符串一旦创建,其内容就不能更改。

2024-02-01 18:37:57 757 1

原创 golang网络编程day4

用于指定响应内容的最后修改时间。它的值是一个HTTP日期格式的时间字符串,例如"Sun, 17 Mar 2024 12:34:56 GMT"。

2024-02-01 03:32:36 1116 1

原创 算法day7

1.我前面我感觉我写的if太多了,而且一步步的往后迭代也太慢了,用的变量也是有点多了,看着就不舒服。这里的解释:在需要扩容的时候,单词append的时间复杂度会到o(N),但是这种情况发生的概率是比较低的,Go的扩容策略通常会增加当前容量的一定比例(比如增加一半或翻倍),这意味着随着切片不断增长,扩容操作的频率会降低。这与append有关,append在大多数情况下认为是o(1)的,但是当append底层数组需要扩容时,那就会编程o(n),n是新数组的长度,因为这个扩容涉及到分配新数组和旧数组元素的赋值。

2024-01-31 20:45:02 620

原创 golang网络编程day3

以上是http客户端和服务器的基本用法,这个包还有很多其他的功能,比如实现了WebSocket,HTTP长连接,Http代理等等。根据需要查询文档。

2024-01-31 04:26:26 842

原创 golang网络编程day2

用net包里面的Dial()拨号函数,直接建立起了到目标IP地址服务器的连接,得到这个连接后我可以进行相关的操作,比如我就调了一个Fprintf函数往这个连接里面发了个HTTP Get请求。由于HTTP是请求和响应这样的工作方式,我就掉了这个Conn的Read,读取这个HTTP的响应。最后把读出的内容打印出来。除了上面例子里面用到的函数,还有很多的函数是很常用的网络编程函数,比如net.Listen,net.Accept,net.DialTimeout,net…ResolveTCPAdddr等等。

2024-01-31 00:16:30 1020

原创 算法day6

两个数组两个数组的遍历,这样时间复杂度就降下来了,思考这句话。这个题目很像前面做过的有效字母的异位词。用一个容器先遍历一个数组,然后遍历另一个数组的时候看这个容器里有没有想要的元素,这不过这个题编程了两个for循环。做题的时候,key放什么合适,value放什么合适。思考这个也是做题的突破口。

2024-01-30 21:05:04 806 1

原创 算法day5

今天的题目主要关注三个东西,算法思路,语法性质,常用的算法处理。

2024-01-29 18:50:49 680

原创 golang网络编程day1

今天的学习基本上都是有关理论上的了解和学习,由于之前学过计算机网络,所以大多感觉都是能接受,某些概念不懂就直接去找资料学就行了。明天开始进行对库函数的使用和实操。

2024-01-28 22:52:40 762

原创 1.28算法学习总结

所以按照偶数的处理,fast最终指向最后一个1,slow指向3,此时我的目标还是后半段元素,这里我就可以做一个特判,这里和偶数的区别就是偶数的fast=nil,奇数的fast!2.我对逆置的应用还是理解有点少了,之前我就想歪了,歪到我想直接将这个后半部分原地逆置,这显然是不合理的,这样我必然会动到前面部分的指针,而我的目的我根本不需要这么原地逆置,我只要拿到后半段。这样就方便比对元素了。我做的时候我还想了一个问题,因为有时候我对空间复杂度这方面有点疑问,我这里空间复杂度是o(1),这个链表只是个指针。

2024-01-28 17:25:24 617

空空如也

空空如也

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

TA关注的人

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