在 Go 项目中,一个业务方法往往会调用数据库、缓存或者其他服务。如果每次测试都依赖真实环境,不但准备数据麻烦,也很难稳定地复现超时、查询失败等情况。

单元测试可以把这些依赖替换成可控制的实现,让我们专注验证业务逻辑。本文通过一个查询用户资料的例子,介绍如何使用字节跳动的 Mockey 和 GoConvey 编写单元测试。

两者的职责不同:Mockey 负责打桩,GoConvey 负责组织测试场景和执行断言。测试入口和执行命令仍然使用 Go 自带的 testing 和 go test。

阅读全文 »

Thrift简介

Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统)、Cappuccino、Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk。虽然它以前是由Facebook开发的,但它现在是Apache软件基金会的开源项目了。该实现被描述在2007年4月的一篇由Facebook发表的技术论文中,该论文现由Apache掌管。[1]

阅读全文 »

因为工作需要,最近在学习Java。在学习的过程中,由于什么软件都喜欢用新版(┑( ̄Д  ̄)┍)踩了不少的坑,分享一下社区版IDEA中启动Tomcat的相关配置与代码Demo。
本人使用的软件环境为Java17 + Tomcat10 + IDEA2021.3.3,代码参考了廖雪峰老师的博客[1]。

阅读全文 »

什么是堆栈

堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象资料类型,只允许在有序的线性资料集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作[1]。

操作

堆栈使用两种基本操作:推入(压栈,push)和弹出(弹栈,pop):

  • 推入:将资料放入堆栈顶端,堆栈顶端移到新放入的资料。
  • 弹出:将堆栈顶端资料移除,堆栈顶端移到移除后的下一笔资料。
阅读全文 »

什么是排序

在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法[1]。本文中将使用Golang实现几种常见的排序算法。

Golang 实现冒泡排序

冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端[2]。

阅读全文 »

什么是链表

在计算机科学中,链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)[1]。

Golang 实现单向链表

阅读全文 »

最近公司新项目开始使用PHP8,之前使用的扩展也需要升级,更换成支持PHP8的版本。在使用RabbitMQ时需要使用到php-amqp扩展,我安装的时候发现网上的一些安装教程都比较旧了,顶多支持到php7对应的版本。下面记录一下php8相关扩展的安装过程。

安装rabbitmq-c

安装PHP-AMQP扩展前首先要安装 rabbitmq-c,rabbitmq-c 是一个支持 RabbitMQ v2.0+ 版本的由C语言开发的 AMQP 客户端库。

按照官方说法安装rabbitmq-c需要使用 v2.6及以上版本的CMake进行构建,我们先安装一下它:

1
sudo dnf install cmake
阅读全文 »

事务概念

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务主要用于处理操作量大,复杂度高而的数据。比如在支付过程中,涉及到账户金额的变更、用户商品关系的建立和订单状态修改等操作,此时我们需要保证整个支付过程中所有数据的变更操作全部执行成功,或者完全恢复到支付前的状态,此时,我们就需要使用事务。

注:
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句。

阅读全文 »

什么是defer

在 Golang 中 defer 是一个关键字,它用来实现 延迟调用函数:当 defer 语句被执行时,跟在 defer 后面的函数会被延迟执行。直到包含该 defer 语句的函数执行完毕时,defer 后的函数才会被执行,不论包含defer语句的函数是通过 return 正常结束,还是由于 panic 导致的异常结束。你可以在一个函数中执行多条defer语句,它们的执行顺序与声明顺序相反[1]。

既然 defer 之后的函数是在“主函数”(这个主函数是先对于 defer 定义的延迟调用函数而言的)执行完毕后执行,那就可能出现这样一种情况:“主函数”在执行完成之后生成了返回值,延迟调用函数继续执行,假如此时延迟调用函数修改了返回值,会发生什么?

阅读全文 »

什么是队列

队列,又称为伫列(queue),计算机科学中的一种抽象资料型别,是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。

队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加[1]。

Golang 实现单链队列(数组)

在 Golang 中使用数组实现一个单链队列,除了需要创建一个数组存储数据外,还要定义最大值(maxSize)、头指针(front)和尾指针(rear),其中头指针和尾指针的初始值为-1。

当向队列中插入数据时,头指针不变,尾指针+1,最后在数组的尾指针位置赋值。

当从队列中取出数据时,尾指针不变,头指针+1,最后在数组的头指针位置取值。

阅读全文 »
0%