ALOVN

志当存高远

CORS跨域原理

CORS(Cross-Origin Resource Sharing)

CORS的全称是Cross-Origin Resource Sharing,在前后端分离的开发模式下,对于跨域一定不会陌生。这是浏览器为了安全而使用的同源策略,也就是说当你的网页的域名和请求api数据的域名不一致的时候就会被浏览器禁止。默认情况下所有违背同源策略的请求都会被浏览器禁止,但是有些资源是不受同源策略限制的,比如说js script文件、css、图片等,这也使得我们的网站页面可以加...

Golang 函数内联

Golang inline

函数内联 函数内联是编译器的一种优化技术,它是指将较小的函数直接组合到调用者的函数中,这样可以减少函数调用带来的开销,不过这样编译出来的二进制体积会稍大一些。 在Go语言中,在函数前加上//go: noinline指令,就可以在编译的时候禁止对函数内联优化。 示例 下面是一个基准测试,对比下函数有没有被内联性能差距: 1 2 3 4 5 6 7 8 9 10 11 12 //go:...

Golang 闭包变量捕获分析

Golang closure variable capture analysis

变量捕获 Go语言中的变量捕获主要是用于处理闭包的,由于闭包中可能会引用到外部变量,所以对于捕获的变量需要明确在闭包中通过值或引用的方式进行传递。 示例 1 2 3 4 5 6 7 8 9 10 11 12 package main import "fmt" func main() { a := 1 b := 2 func(){ for i:=0; i < 1...

Golang Fuzzing测试

Golang fuzzing test

简介 Fuzzing 是一种自动化测试,它不断地操纵程序的输入以查找错误。它用半随机的数据可以测试出代码中潜在的bug。可以弥补遗漏的单元测试、发现易被忽视的边界输入的情况。因此fuzzy测试对于发现安全漏洞和漏洞特别有价值。Go1.18版本开始支持fuzzy测试。 下面是一个fuzz的测试示例,并标识了它的主要组成部分: fuzz tests 必要条件 下面是写一个fuzz测...

Golang使用httptest对HTTP服务进行Mock

Golang uses httptest to Mock HTTP services

现在稍有点规模的服务已经很少由一个单独的程序完成所有功能,一般会按照功能模块拆分成多个服务,服务也可能会依赖其它第三方提供的服务。在工作进行程序开发时,若依赖的接口上游的服务没有开发完成时,为了不影响开发进度和功能测试,这时候就需要Mock上游的Web API接口。Golang中提供的httptest包同样可以进行Mock HTTP服务。 示例 直接看代码示例: 1 2 3 4 5 6...

Golang使用httptest测试返回结果

Using httptest to test return results in Golang unit tests

httptest 在开发中Web API接口开发完成后,若需要进行http传参与响应返回的测试,一般的做法是启动一个HTTPServer,但在这样启动慢而且不方便,那有没有什么方式不需要启动一个HTTPServer呢?Golang提供的net/http/httptest包可以实现。 httptest.NewRequest httptest.NewRequest模拟了一个Request。...

Golang组合式继承

Golang composite inheritance

Go语言中没有继承,但是可以通过组合实现继承。组合的方式可以是值类型也可以是指针类型,那么它们实现继承的方式有什么不同呢? 现有如下main.go的定义,B为值类型组合,C为指针类型组合: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package main type A struct { value int } ...

MySQL的备份架构

MySQL backup architecture

通过复制建立的从服务器可以实现故障转移,但是仅仅通过复制来备份是不够的。假设一个系统采用了主从的复制架构,从服务器用来作备份,这时程序中Bug或人为误操作执行了Delete操作,那么从服务器也跟着运行了Delete操作,这时候备份机制就起不到作用了,那么又应该怎样来进行数据恢复呢? 我们可以通过采用延时复制的方法,即从服务器间歇的进行同步操作,譬如每两个小时进行一次同步。这种方式的缺点是数...

MySQL死锁等待与超时事务回滚

MySQL InnoDB death lock timeout and transaction rollback

死锁 死锁是指两个或两个以上的事务在执行过程中因争夺资源而造成的一种互相等待的现象。解决死锁的最简单的方式就是不要等待,将等待转换为回滚,但是这样会导致资源浪费、并发性能的下降。 MySQL中采用了超时机制解决死锁:当两个事务互相等待的时候,当一个等待时间超过设置的阈值时,其中一个事务进行回滚,另一个事务则继续进行。 除了超时机制,此外InnoDB还根据锁的信息链表和事务等待链表实现了...

关闭brew自动更新检测

Disabled brew auto update check

MacOS下每次执行brew install时都会很慢,可以看到它输出的提示是:Updating Homebrew…,那是因为它在执行自动更新。这就有些烦人了,我们并并不需要它每次都检测更新,这会浪费很多时间,所以要关闭它。 1 2 3 vi ~/.zshrc export HOMEBREW_NO_AUTO_UPDATE=true source ~/.zshrc 之后再次执行brew就...