Skip to content

Commit

Permalink
修改文档
Browse files Browse the repository at this point in the history
  • Loading branch information
bg5sbk committed Oct 25, 2016
1 parent 96c74ea commit f2d9982
Showing 1 changed file with 5 additions and 28 deletions.
33 changes: 5 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,46 +104,23 @@ func checkErr(err error) {
[channel.go](https://github.com/funny/link/blob/master/channel.go)
--------------

这个文件里实现了`Channel`类型的模板,`Channel`类型用于管理一组`Session`,通常用于发送广播和维护在线列表。
这个文件里实现了`Channel`类型用于管理一组`Session`,通常用于发送广播和维护在线列表。

这个文件是不参与编译的,link实际上不存在一个叫`Channel`的类型,这个文件只是`Channel`类型的模板。

之前版本的通用`Channel.go`类型,用的是`Session.ID()`做key,这个设计会导致实际项目种出现类似这样的操作逻辑:
之前版本的`Channel`类型,用的是`Session.ID()`做key,这个设计会导致实际项目种出现类似这样的操作逻辑:

```
取用户ID -> 从自己维护的映射关系中取用户ID对应的Session ID -> 到Channel里取Session
```

而新的`Channel.go`类型可以自定义key类型,在上述场景中就可以直接用`用户ID`做key来索引`Session`
而新的`Channel`类型可以自定义key类型,在上述场景中就可以直接用`用户ID`做key来索引`Session`

```
取用户ID -> 到Channel里取Session
```

除了直观的可以看出少了一次map操作之外,其实额外维护一份`Session ID`映射关系也不是一件容易的事情,你需要重复`Channel.go`内部做的所有事情,而又不能重用`Channel.go`的代码。

不同的应用场景会需要用不同的信息来索引`Session`,但是Go暂不支持泛型语法,所以我们通过`channel_gen.go`这个工具来生成具体的`Channel`类型的代码。

举例,生成一个用`uint64`类型作为key的`Channel`

```
go run channel_gen.go Uint64Channel uint64 channel_uint64.go
```

`channel_gen.go`的参数列表如下:

* 第一个参数为类型名,不一定非得叫Channel,可以根据实际使用场景来命名
* 第二个参数是key的类型,通常是int之类的简单类型,但如果需要同时根据多个条件索引Session,可以使用结构体做key
* 第三个参数是输出的代码文件名
* 第四个参数是可选的包名称,没有指定此参数时生成的代码归属于link包,你可以通过这个参数生成归属于自己包的代码

此外,link借助`go generate`命令内置了一组常用到的`Channel`类型的代码生成。因为这些代码是工具自动生成的,所以不纳入版本管理,在刚拿到link包的代码时是找不到这些代码的。

需要在link包的根目录下执行`go generate channel.go`命令来生成这些类型。

关于`go generate`的原理请参阅Go官方文档。
除了直观的可以看出少了一次map操作之外,其实额外维护一份`Session ID`映射关系也不是一件容易的事情,你需要重复`Channel`内部做的所有事情,而又不能重用`Channel`的代码。

提示: 使用`Channel.Fetch()`进行遍历发送广播的时候,请注意存在IO阻塞的可能,如果IO阻塞会影响业务处理,就需要使用异步发送,关于异步发送请参考`codec_async.go`的说明
使用`Channel.Fetch()`进行遍历发送广播的时候,请注意存在IO阻塞的可能,如果IO阻塞会影响业务处理,就需要使用异步发送。

相关项目
====
Expand Down

0 comments on commit f2d9982

Please sign in to comment.