Kevin Yan

Results 92 issues of Kevin Yan

关于接下来要写什么: 你们在这个时间点看到的文章已经把Laravel的Database部分都讲完了,接下来的计划是: 事件系统、用户认证系统、异常处理、Session以及Laravel应用请求整个生命周期的总结,当然我也想把 Composer原理和Laravel中用到的设计模式说一下以便更好的理解。时间来到了6月,希望能在18年把Laravel这些核心相关的东西大体梳理完,把年初挖的这个坑填上。 关于问题反馈和交流: 我在写这些文章时都会尽量严谨防止由于自己的失误误导大家,有的部分源码过多也就难免会有贴上了大块源码的地方,如果有看不懂的也欢迎针对话题新开issue来讨论。

good first issue

Laravel Cookie源码分析,首先还是从Cookie如何在Laravel中应用开始逐步讲解Laravel框架中Cookie的服务注册、生成Cookie以及获取Cookie。 梳理过程中发现Laravel在设置Cookie时全程没有调用过PHP原生的setcookie函数,而是通过依赖的Symfony框架的Response对象将Cookie先暂存在其引用的headers对象里最后在响应发送给客户端时前的send方法里将Cookie设置到了响应首部字段Set-Cookie中。 文章比较长,有不明白的地方可以留言,我有时间了一定会第一时间回复。 文章链接:https://github.com/kevinyan815/Learning_Laravel_Kernel/blob/master/aritcles/Cookie.md

单例模式,分两种加载模式,下面介绍下 Go 里面怎么使用单例模式。 ## 饿汉模式 适合程序初始化时就确定怎么加载实例的情况 ```go package singleton // Singleton 饿汉式单例 type Singleton struct{} var singleton *Singleton func init() { singleton = &Singleton{} } // GetInstance 获取实例 func GetInstance()...

## Go 优雅处理错误的几种方案 在 Go 语言官方库 `bufio` 中 `Scanner`对象的错处处理的实现方式可以给我们一点启发,它大概是这么实现的。 ```go scanner := bufio.NewScanner(input) for scanner.Scan() { token := scanner.Text() // process token } if err := scanner.Err(); err != nil...

在编程领域里,枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机。拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应。 在刚开始学编程的时候,你一定写过,至少见过直接使用魔术数字进行判断的代码。啥叫魔术数字呢,举个例子,要置顶一个文章的时候先判断文章是不是已发布状态。 ```java if (article.state == 2) { // state 2 代表文章已发布 } ``` 假如我们的代码里没有注释,或者等我们项目的代码里充斥着这些魔术数字的判断的时候,你是不是会很头疼? 后来我就学会了把这些状态值定义成常量,并且也搞一个判断对象状态的方法单独封装这段逻辑。 ```java public class ArticleState { public static final int Draft = 1; //草稿 public...

不多解释,直接看代码~~ ```go const lotteryBase = 10000 type LotteryPrize struct { Id int64 // 奖品ID Name string // 奖品名 Rate float64 // 中奖概率 Type int8 // 自行配置,比如实物奖、虚拟奖、谢谢惠顾之类的 probability int64 // 概率数...

在 Go 单元测试这个系列的第二部分 [数据库的Mock测试](https://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU2MA==&mid=2247493173&idx=1&sn=ef47fc8591a1976e0e254ed76cb1e144&chksm=fa8337a2cdf4beb45a1b55c0e231fa3f340afc4d37f590b237faedce720e2a0a51ae7c2d50a9&token=363190209&lang=zh_CN#rd) 中我们介绍了用 `go-sqlmock` 给数据库的 CRUD 操作做Mock 测试的方法,不过里面只是讲解了一下怎么对原生的`database/sql`执行的 SQL 进行 Mock 测试。 ## 前言 真实的开发场景下我们的项目一般都会使用 ORM ,而不是原生的`database/sql`来完成数据库操作。在很多使用ORM工具的场景下,也可以使用`go-sqlmock`库 Mock数据库操作进行测试,今天这篇内容我就以 GORM 为例,讲解怎么给项目中的 ORM 数据库操作做单元测试。 ## 项目准备 为了场景足够真实,我用 2020 年我更新的 「[Go...

>转载自:https://www.liwenzhou.com/posts/Go/golang-unit-test-6/ 示例代码原作者已上传至Github,点击👉🏻https://github.com/Q1mi/golang-unit-test-demo 查看完整源代码。 这个系列中已经介绍了很多 Go 单元测试的技能和工具,在这一篇中我们不再介绍编写单元测试的工具而是专注于如何编写可测试的代码。 ## 编写可测试的代码 编写可测试的代码可能比编写单元测试本身更加重要,可测试的代码简单来说就是指我们可以很容易的为其编写单元测试代码。编写单元测试的过程也是一个不断思考的过程,思考我们的代码是否正确的被设计和实现。 接下来,我们将通过几个简单示例来介绍如何编写可测试的代码。 ### 剔除干扰因素 假设我们现在有一个根据时间判断报警信息发送速率的模块,白天工作时间允许大量发送报警信息,而晚上则减小发送速率,凌晨不允许发送报警短信。 ```go // judgeRate 报警速率决策函数 func judgeRate() int { now := time.Now() switch hour := now.Hour(); { case...

golang中map是引用类型,应用类型的变量未初始化时默认的zero value是nil。直接向nil map写入键值数据会导致运行时错误`panic: assignment to entry in nil map` 看一个例子: ``` package main const alphabetStr string = "abcdefghijklmnopqrstuvwxyz" func main() { var alphabetMap map[string]bool for _, r := range alphabetStr...

>转载自:https://www.liwenzhou.com/posts/Go/golang-unit-test-3/ 示例代码原作者已上传至Github,点击👉🏻https://github.com/Q1mi/golang-unit-test-demo 查看完整源代码。 这是Go语言单元测试从零到溜系列教程的第5篇,介绍了如何在单元测试中使用monkey进行打桩。 在上一篇[《Go单元测试--Mock接口实现和对接口打桩》](https://mp.weixin.qq.com/s/grPERmezORRTUv29sCbxEg)中,我们介绍了如何在单元测试中使用`gomock`和`gostub`工具mock接口及打桩。 在这一篇中我们将介绍一个更强大的打桩工具——`monkey`,它支持为任意函数及方法进行打桩。 ## monkey ### 介绍 monkey是一个Go单元测试中十分常用的打桩工具,它在运行时通过汇编语言重写可执行文件,将目标函数或方法的实现跳转到桩实现,其原理类似于热补丁。 monkey库很强大,但是使用时需注意以下事项: - monkey不支持内联函数,在测试的时候需要通过命令行参数`-gcflags=-l`关闭Go语言的内联优化。 - monkey不是线程安全的,所以不要把它用到并发的单元测试中。 ### 安装 ``` go get bou.ke/monkey ``` ### 使用示例 假设你们公司中台提供了一个用户中心的库`varys`,使用这个库可以很方便的根据uid获取用户相关信息。但是当你编写代码的时候这个库还没实现,或者这个库要经过内网请求但你现在没这能力,这个时候要为`MyFunc`编写单元测试,就需要做一些mock工作。 ```go // func.go func...