Jonathan Blog

Thinking will not overcome fear but action will.

数据库的那些事

数据库原理 ACID 原子性(Atomicity) 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。 回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。 一致性(Consistency) 数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都...

Golang的Runtime调度(CSP模型,GMP实现)

CSP并发模型 CSP并发模型它不关注发送消息的实体,而关注与发送消息时使用的channel。go语言借用了 process和channel这两个概念。process是在go语言上的表现就是 goroutine,是实际并发执行的实体,每个实体之间是通过channel通讯来实现数据共享。 Golang实现了 CSP 并发模型做为并发基础,底层使用goroutine做为并发实体,gorouti...

代码笔记-MySQL数据库内容导出到Excel

项目中有时后台需要根据筛选条件将数据导出到EXCEL,主要还是对Go的反射和结构体tag的运用吧,代码如下: struct声明及gorm查询 type VillageRecord struct { gorm.Model Area string `xlsx:"A-行政区划"` TownName string `xlsx:"B-乡镇名称"` Villag...

Go随机数踩得坑

CASE1:不设置随机数种子,得到的随机数序列是固定的 输入: func main() { fmt.Println("My first lucky number is", rand.Intn(10)) fmt.Println("My senond lucky number is", rand.Intn(10)) } 输出: My first lucky number is ...

如何拯救一个无法进入的容器

容器在使用时经常会出现手动修改系统参数导致无法启动的情况,这篇文章主要介绍一下相关的注意事项和方法。 基本原则 基本原则1: 不经常变动或者变动很少的设定信息应该固化至Dockerfile或者镜像之中。 基本原则2: 有定制需要的设定配置文件应该以挂载等允许的方式进行外部持久化存储 具体示例 比如修改了MySQL容器中的max_allowed_packet参数,导致MySQL无法启动...

Golang RESTful 框架之 Go-Swagger

restful 是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的 restful api,其实 restful 和 thrift,grpc 类似,就是一种协议,但是这种协议有点特殊的就是使用 http 接口,返回的对象一般是 json 格式,这样有个好处,就是可以供前端的 js 直接调用,使用非常方便,但 http 本身并不是一个高效的协议,后端的内部通信还是使用 grpc 或者 t...

GORM关联查询(Preload、Related)

定义了一个 User 和 Company, User 中可以包含多个 Company, 如下: type User struct { ID int `gorm:"TYPE:int(11);NOT NULL;PRIMARY_KEY;INDEX"` Name string `gorm:"TYPE: VARCHAR(2...

Go实现set类型

如何实现set Go中是不提供Set类型的,Set是一个集合,其本质就是一个List,只是Set里的元素不能重复。 Go提供了map类型,但是我们知道,map类型的key是不能重复的,因此,我们可以利用这一点,来实现一个set。那value呢?value我们可以用一个常量来代替,比如一个空结构体,实际上空结构体不占任何内存,使用空结构体,能够帮我们节省内存空间,提高性能. 下面看看两种结...

Win10激活

slmgr /upk 卸载当前密钥 slmgr /ipk 序列号 安装新密钥 slmgr /skms zh.us.to 设置密钥管理服务器 slmgr /ato 激活 slmgr /dli 查询系统激活状态 win10专业版激活密钥(32位和64位均可正常使用): W269N-WFGWX-YVC9B-4J6C9-T83GX VK7JG-NPHTM-C97JM-9MPGT-3V...

Golang执行CMD方法

Golang执行系统命令使用 os/exec Command方法: func Command(name string, arg ...string) *Cmd 第一个参数是命令名称,后面参数可以有多个命令参数。 cmd := exec.Command("ls", "-a") if stdout, err := cmd.StdoutPipe(...