防止goroutine泄露的一般机制

goroutine 泄露 当 goroutine 被永远阻塞,或者只有主 goroutine 终止时,子 goroutine 才会终止, 即子goroutine 没有自行终止的时机 goroutine 便无法释放其所占的内存空间 一般解决方案: 由父goroutine告知子goroutine终止时机 准则: 父

select用法示例

Go中的select和channel配合使用,通过select可以监听多个channel的I/O读写事件,当 IO操作发生时,触发相应的动作。 基本使用 // 常规示例 func example() { done := make(chan interface{}) // 一段时间后发送关闭信号 go func()

Linux搭建samba服务

安装 samba yum install samba 修改配置文件 修改配置文件 vim /etc/samba/smb.conf 添加要共享的目录 [opt] # 被共享目录的别名 path = /home/dccmmtop/opt # 要共享的目录 browseable = yes writable = yes # 可以写入 valid users = dccmmtop # 用户,该用户要有目录的权限 create mode=0777 directory mode=0777 force create mode=0777 force directory mode=0777 添加用户 将用户 dccmmtop 设置为可以

构建docker环境开发Rails

初始化项目 新建 myapp 目录,在下面添加 Dockerfile 文件,如下: Dockerfile FROM ruby:2.5 RUN apt-get update -qq && apt-get install -y nodejs default-mysql-client ADD . /myapp WORKDIR /myapp RUN bundle install EXPOSE 3000 CMD ["bash"] Gemfile 再新建 Gemfile 文件 source 'https://gems.ruby-china.com' # 安装 Rails gem 'rails', '~> 5.1.3' docker-compose.yml version: '3.3' # 使用已经存在的外部网络 networks: default: external: name: dev_network services: web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s

Go池

为什么需要池 用来约束创建和复用昂贵的场景,比如数据库连接 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文件进行读取,而刚刚写入的数据有可能还滞