为什么需要池 用来约束创建和复用昂贵的场景,比如数据库连接 Go是怎么实现的池 通过 sync.Pool 包实现,并发安全 怎么使用 Get 方法,首先检查池中是否有可用的实例返回给调用者,如果没有,调用New 方法创建新的实例,并返回 使
Go单元测试
概念 测试是编程工作中非常重要的一环,但很多人却忽视了这一点,又或者只是把测试看作是一种可有可无的补充手段。Go语言提供了一些基本的测试功能,这些功能初看上去可能会显得非常原始,但正如将要介绍的那样,这
Go写入json
这个封装程序使用的结构和之前分析JSON时使用的结构是相同的。 程序首先会创建一些结构,然后通过调用MarshalIndent函数将结构封装为由字节切片组成的JSON数据 最后,程序会将封装所得的JSON
Go解析json文件
可以使用Unmarshal函数来解封JSON,还可以使用Decoder手动地将JSON数据解码到结构里面,以此来处理流式的JSON数据, 流程如下 要解析的json文件 { "id": 1, "content": "Hello world!", "author":{ "id":2, "name": "Sau Sheong" }, "comments": [ { "id": 3, "content":
gorm包使用
自动迁移 因为Gorm可以通过自动数据迁移特性来创建所需的数据库表,并在用户修改相应的结构时自动对数据库表进行更新, 当我们运行这个程序时,程序所需的数据库表就会自动生成 负责执行数据迁移操作的AutoMi
sqlx包的使用
sqlx是一个第三方库,它为database/sql包提供了一系列非常有用的扩展功能。 因为sqlx和database/sql包使用的是相同的接口,所以sqlx能够很好地兼容使用database/sql
Go与SQL
连接数据库 sq1.DB结构是一个数据库句柄(handle),它代表的是一个包含了零个或任意多个数据库连接的连接池(pool),这个连接池由sql包管理。程序可以通过调用Open函数,并将相应的数据库驱
MySQL 和 Redis 的数据一致性问题
什么是数据的一致性 “数据一致”一般指的是:缓存中有数据,缓存的数据值 = 数据库中的值。 但根据缓存中是有数据为依据,则”一致“可以包含两种情况: 缓存中有数据,缓存的数据值 = 数据库中的值(需均为最新值,本文
ruby分布式锁
#ruby的分布式锁实现,基于redis class Redlock DefaultRetryCount=3 DefaultRetryDelay=200 ClockDriftFactor = 0.01 UnlockScript=' if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end' def initialize(*server_urls) @servers = [] server_urls.each{|url| @servers << Redis.new(:url => url) } @quorum = server_urls.length / 2 + 1 @retry_count = DefaultRetryCount @retry_delay = DefaultRetryDelay @urandom = File.new("/dev/urandom") end def set_retry(count,delay) @retry_count = count @retry_delay = delay end def lock_instance(redis,resource,val,ttl) begin return redis.client.call([:set,resource,val,:nx,:px,ttl]) rescue return false end end def unlock_instance(redis,resource,val) begin redis.client.call([:eval,UnlockScript,1,resource,val]) rescue # Nothing to do, unlocking is just a
Go读写CSV
对Go语言来说,CSV文件可以通过encoding/csv包进行操作,下面通过这个包来读写CSV文件。 由于程序在接下来的代码中立即就要对写入的posts.csv文件进行读取,而刚刚写入的数据有可能还滞
幂等设计
概念 幂等这个概念,是一个数学上的概念,即:f……(f(f(x))) = f(x)。用在计算机领域,指的是系统里的接口或方法对外的一种承诺,使用相同参数对同一资源重复调用某个接口或方法的结果与调用一次的结果
日志切割logrotate原理和配置
logrotate 在很多 Linux 发行版上都是默认安装的。系统会定时运行 logrotate,一般是每天一次。系统是这么实现按天执行的。crontab 会每天定时执行 /etc/cron.daily 目录下的脚本,而这个目录下有个文件叫 logrotate。在 centos
Go模板之上下文感知
上下文感知 Go语言的模板引擎可以根据内容所处的上下文改变其显示. 上下文感知的一个显而易见的用途就是对被显示的内容实施正确的转义(escape):这意味着,如果模板显示的是HTML格式的内容,那么模板将
Go模板之动作
Go的模板动作就是嵌入模板的命令 条件动作 {{ if arg }} some content {{ else }} other content {{ end }} 迭代动作 迭代动作可以对数组,切片,映射,或者通道进行迭代, 在迭代循环内部, 点(.) 会被设置正在当前迭代内容 设置动作 设置动作允许为指定