用Go编写一个简单的定时执行任务程序
用Go编写一个简单的定时器,首先需要考虑定时器需要实现哪些功能?
定时执行
拦截执行错误
批量添加执行,检测执行存活
批量停止执行,检测执行停止
定义结构体要解决我们第1.3.4点的需求,需要定义一个结构体,用于存储任务信息,以及任务状态
123456789101112type _Job struct { // 名称 Name string // 是否运行 Running bool // 执行间隔 Ticker *time.Ticker // 任务方法 Call func() // 是否已关机 IsShutdown bool}
在执行过程中,通过不断获取结构体中的信息,来检测状态以及执行任务
初始化任务为了在程序启动时自动开始任务,我们定义了一个jobMap用来全局存储任务状态,以及定义了一个初始化函数initJob,并在其中添加了个任务myJob。这些任务会以一定的频率(例如每分钟一次)执行。如果你不希望系统执行任务,可以在配置中关闭它。
123456789101112131415161718var jobMap sync.Mapfunc initJob() ...
什么是HTTP 204?
204有什么用?204 No Content:服务器成功处理了请求,但没返回任何内容。
你也许会有疑问:“返回一个没有响应体的HTTP/200响应不行吗?”
如果没有响应体,则在大多数场景下,这两种响应码完全等效,但有一种情况下,HTTP/204响应会让浏览器有不同的表现。这种情况就是当用户在浏览器窗口window或者frame/iframe框架中导航的时候。
204 No Content
If the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent’s active document view, although any new or updated me ...
VO、DTO、BO、PO区别
最近在项目中的model层看到有这么几个包:VO、DTO、BO、PO,每个包下有以包名结尾的类,这些存储数据的简单类,有什么作用呢?
通过一张图可以一眼清晰明了地看出它们的作用
VO(Value Object)值对象VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,这就叫VOVO主要的存在形式就是js里面的对象(也可以简单理解成json)
DTO(Data Transfer Object)数据传输对象这个传输通常指的前后端之间的传输
DTO是一个比较特殊的对象,他有两种存在形式:
在后端,他的存在形式是Go的结构体,通常在后端不需要关心怎么从Go的结构体转成json的,这个都是由一些成熟的框架帮你完成啦,比如Gin框架
在前端,他的存在形式通常是js里面的对象(也可以简单理解成json),也就是通过ajax请求的那个数据体
VO和DTO的区别主要有两个区别
一个是字段不一样,VO根据需要会删减一些字段
另一个是值不一样,VO会根据需要对DTO中的值进行展示业务的解释
举个简单的例子
DTO可能是这样的
1234{ & ...
Go 代码开发规范
在Go 项目开发中,一个好的编码规范可以极大的提高代码质量。为了帮你节省时间和精力,这里我整理了一份清晰、可直接套用的 Go 编码规范,供你参考。
这份规范,是我参考了 Go 官方提供的编码规范,以及 Go 社区沉淀的一些比较合理的规范之后,加入自己的理解总结出的,它比很多公司内部的规范更全面,你掌握了,以后在面试大厂的时候,或者在大厂里写代码的时候,都会让人高看你一眼,觉得你code很专业。
这份编码规范中包含代码风格、命名规范、注释规范、类型、控制结构、函数、GOPATH 设置规范、依赖管理和最佳实践九类规范。如果你觉得这些规范内容太多了,看完一遍也记不住,这完全没关系。你可以多看几遍,也可以在用到时把它翻出来,在实际应用中掌握。这篇特别放送的内容,更多是作为写代码时候的一个参考手册。
1. 代码风格1.1 代码格式
代码都必须用 gofmt 进行格式化。
运算符和操作数之间要留空格。
建议一行代码不超过120个字符,超过部分,请采用合适的换行方式换行。但也有些例外场景,例如import行、工具自动生成的代码、带tag的struct字段。
文件长度不能超过800行。
函数长度不能超 ...
如何使用 Go 多版本(Mac)
Mac 下使用 homebrew 可以轻松实现 Go 多版本切换。
使用以下方法安装最新版本:
1$ brew install go
写这篇文章时,Go 的最新版本为 1.20:
12$ go versiongo version go1.18.10 darwin/amd64
使用以下方法安装指定版本:
1$ brew install go@1.19
首先 unlink:
12$ brew unlink go@1.18Unlinking /usr/local/Cellar/go/1.18.10... 0 symlinks removed.
link 指定版本:
123$ brew link go@1.19Linking /usr/local/Cellar/go@1.19/1.19.8... 2 symlinks created....
测试下是否成功:
12$ go versiongo version go1.19.8 darwin/amd64
如要恢复最新版本,重复以上 unlink 和 link 操作即可。
MySQL
基础
MYSQL三范式
列不可分,即每一列都是最小的数据单元,确保列的原子性
必须有主键,非主键属性必须完全依赖主键,假如有复合主键也不得只依赖一部分
非主键属性不得相互依赖,任何非主属性不得依赖其他非主属性
如:「用户表」里有部门表的id字段就可以了,不需要再添加部门表的name什么的
MYSQL反范式
通过增加冗余数据来提高查找效率
如:在 用户表 与 角色表 中间 增加 用户-角色表
MYSQL是什么?
MSQL是一个传统的RDBM数据库,也就是关系型数据库,广泛运用于OLTP场景
ACID是什么?
它是原子性、一致性、隔离性和持久性
原子性:一个事务只有成功和失败两种状态
一致性:事务只会同时成功或同时失败,状态一定是一致的
隔离性:事务之间相互不影响
持久性:事务执行完成后,对数据所做的操作会一直保存在数据库中
SQL命令你知道有哪几类吗?
SQL命令分为5类,分别有DDL,DML,DQL,DCL和TCL
DDL(数据定义语言)用于定义数据库结构,如常见的创建表、删除表等操作
DQL(数据查询语言)用于从数据库检索数据,如常见的SELECT
DML ...
Golang中的切片(Slice)
切片和数组是Golang中面试经常会问到的问题,值得深入学习。
数组和切片的区别
数组是在编译过程使用new创建的,长度固定,无法动态增减。切片在运行过程使用make创建,可以动态地增减长度
数组传递参数时是以值的拷贝形式传递。切片传递参数时是以引用形式传递。
切片可以使用append或copy等进行增加长度,而数组不能
Slice结构12345slice struct { array unsafe.Pointer // 指针:引用数组元素位置的指针 len int // 长度:引用数组元素起始位置到结束位置的长度 cap int // 容量:引用数组元素起始位置到数组末尾的长度}
slice是一个特殊的引用类型,但是它自身也是个结构体
属性array表示引用的数组元素的指针
属性len表示可用元素数量,读写操作不能超过这个限制,不然就会panic
属性cap表示最大扩张容量,当然这个扩张容量也不是无限的扩张,它是受到了底层数组array的长度限制,超出了底层array的长度就会panic
Slice扩容Go 标准库 runtime/sli ...
int16, int32, int64等类型说明
Int16 意思是16位整数(16bit integer),相当于short 占2个字节 -32768 ~ 32767
Int32 意思是32位整数(32bit integer), 相当于 int 占4个字节 -2147483648 ~ 2147483647
Int64 意思是64位整数(64bit interger), 相当于 long long 占8个字节 -9223372036854775808 ~ 9223372036854775807
Byte 相当于byte(unsigned char) 0 ~ 255
WORD 等于 unsigned short 0 ~ 65535
mysql 与 redis 的区别
mysql和redis的数据库类型
mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。
redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。
mysql的运行机制
mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库:
第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢;
第二:反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生了出来。
什么是缓存
缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取,否则就访问数据库。缓存的好处就是读取速度快
什么是redis
redis数据库就是一款缓存数据库,用于存储使用频繁的数据,这样减少访问数据库的次数,提高运行效率。
总结:
类型上
从类型上来说,mysql是关系型数据库,redis是缓存数据库。
作用上
mysql用于持久化的存储数据到硬盘,功能强大,速度较 ...
Lombok -- Dao快速开发
自从进公司实习后,项目代码中能用 Lombok 的都用了,毕竟这么好的轮子要充分利用好。也可以减少一些 get/set/toString 方法的编写,虽说 IDEA 的插件可以自动生成 get/set/toString 方法,但是使用 Lombok 可以让代码更简洁。
下面看看如何在 IDEA 中如何安装 Lombok:
安装打开 IDEA 的 Settings 面板,并选择 Plugins 选项,然后点击 “Browse repositories”
在输入框输入”lombok”,得到搜索结果,点击安装,然后安装提示重启 IDEA,安装成功;
引入依赖在自己的项目里添加 lombok 的编译支持,在 pom 文件里面添加 dependency
123456789101112<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> ...