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> ...
SpringBoot快速入门
SpringBoot起步依赖Starter
SpringBoot中常见项目名称,定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的
parent
所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
spring-boot-starter-parent(2.5.0)与spring-boot-starter-parent(2.4.6)共计57处坐标版本不同
实际开发
使用任意坐标时,仅书写GAV中的G和A,V由SpringBoot提供
如发生坐标错误,再指定version(要小心版本冲突)
SpringBoot程序启动启动方式
SpringBoot的引导类是项目的入口,运行成main方法就可以启动项目
SpringBoot在创建项目时,采用jar的打包方式
更变起步依赖(starter)
使用maven依赖管理变更起步依赖项
Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty
基础配置配置格式SpringBoot提供了多种属性配置 ...
后端配置教程
9c46282a414f3fd7b78b088c22392b3efaa7b08e6e5a793636c60cb1c9461409380168888b7cc349280c5ea843874108543c84474f71e45c36d66ab27db3d3936a6bf633c683f86671c90bd96827ff8b3263f0407937abe8216f370c1f67255a8ec8e32117aacc160a09497ec31aa56482f6a254c5b184b5fd7e024d33f2682ed53fed0ceedd8b5ceb425a8a094879fc05c48b5a0c1ac626d9faf270009a3c006f9f34c010144753a36298ea490247489650c9bfd5b28d1cd104bcd985863fb0a4ebb628dcd3612d12da2243cd862f8e51343ac4e0e2aa2447caaa6ab7c67803c49d7cd10b959dfc43c95798b6c8f5a4abb1caf76a8d81528 ...