go compile 支持 _ 作为零值

go compile 支持 _ 作为零值

起因

很久以前就有类似的 proposal, 并且官方也有回复, 以下是链接:

个人认为官方还是太过于保守了, 至少目前 go1 的语法下, 在 return 表达式中引入 _ 用于返回错误上还是有一些编写上的方便的(小声 bb).


DIY compile

我的 go 版本 1.10.2, 修改 $GOROOT/src/cmd/compile/internal/gc 下 3 个文件:

  • 增加 hackgc.go
  • 修改 subr.go
  • 修改 typecheck.go

1. 增加 hackgc.go:

...

- 阅读全文 -

grpc 一致性 hash 负载均衡

grpc 一致性 hash 负载均衡

go-grpc 库只提供了一个默认的轮询负载均衡器 grpc.RoundRobin,通过实现 grpc.Balancer 可以实现自定义规则的 Balancer,所以实现一个一致性 hash 的 grpc.Balancer。

Implement

这篇文章的基础上,增加 grpclb 包实现一致性 hash 负载均衡器。

...

- 阅读全文 -

grpc 使用 consul 服务发现

grpc 使用 consul 服务发现

grpc 可以自定义 Balancer,而在 Balancer 基础上可以通过实现自定义的 naming.Resolver 来达到使用 consul 等服务发现组件来发现服务的功能。

大概流程如下:

  1. grpc 在 Dial 的时候通过 WithBalancer 传入 Balancer
  2. Balancer 会通过 naming.Resolver 去解析(Resolve) Dial 传入的 target 得到一个 naming.Watcher
  3. naming.Watcher 持续监视 target 解析到地址列表的变更并通过 Next 返回给 Balancer

implement

提供一个简单实现,目录结构如下:

...

- 阅读全文 -

go get 代理

go get 代理

代理服务端

要把 go get 请求转发别的 repo 上,需要利用 go get 的 discovery 特性去动态查找 repo。

首先要知道 go get 做了什么,定位到 repoRootForImportDynamic 函数(源文件 go/src/cmd/go/internal/get/vcs.go),可以知道命令将 ImportPath 作为 url 发起了一次请求(web.GetMaybeInsecure),并且将获取的到结果使用 parseMetaGoImports 函数(源文件 go/src/cmd/go/internal/get/discovery.go)解析。
根据 parseMetaGoImports 函数可以得知,结果作为 xml 解析,并且在查找所有 meta 元素是否存在 name 属性值为 go-import,如果存在则解析 content 属性值,拆分为 PrefixVCSRepoRoot

那我们可以明确知道了,我们需要返回一个 xml,内容格式可能是这样的

...

- 阅读全文 -

redis RENAME 阻塞

redis RENAME 命令按文档说法是存在一个隐式 DEL 操作,通过查阅代码 db.c 可以得知至少一次 dbDelete,至多两次 dbDelete。

在命令上 redis 是提供了两种删除的操作,DELUNLINK,分别对应了 dbSyncDeletedbAsyncDelete

dbDelete 是对 dbAsyncDelete/dbSyncDelete 的封装,并且由配置 lazyfree_lazy_expire 决定,两个函数区别 dictGenericDelete 是否在执行线程 free K/V pair 和 dict key 内存。