network_factory.go 源码分析
作者:李
- 2022 年 8 月 31 日 湖南
本文字数:1121 字
阅读完需:约 4 分钟
本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star
// 创建一个网络实例func newNetwork(typ NetworkType, logger api.Logger, opt ...Option) (network.Network, error) { //定义一个网络配置 cfg := &networkConfig{} //调用网络配置的apply方法 if err := cfg.apply(opt...); err != nil { return nil, err } //判断网络行 switch typ { case QuicNetwork: // 创建Quic 网络 return newQuicNetwork(cfg, logger) case TcpNetwork: // 创建TCP 网络 return newTcpNetwork(cfg, logger) default: return nil, ErrUnknownNetworkType }}复制代码
网络配置的 apply 方法
func (c *networkConfig) apply(opt ...Option) error { //遍历所有opt for _, o := range opt { //调用opt的方法,并把networkConfig做为参数传入 if err := o(c); err != nil { return err } } return nil}复制代码
查看创建 tcp 网络源码
func newTcpNetwork(cfg *networkConfig, logger api.Logger) (network.Network, error) { //获取网络配置的ctx ctx := cfg.ctx if ctx == nil { ctx = context.Background() } //调用tcp的NewNetwork return tcp.NewNetwork(ctx, logger, tcp.WithTlsCfg(cfg.tlsCfg), tcp.WithLoadPidFunc(cfg.loadPidFunc), tcp.WithEnableTls(cfg.enableTls), tcp.WithLocalPeerId(cfg.lPid), )}复制代码
func NewNetwork(ctx context.Context, logger api.Logger, opt ...Option) (*tcpNetwork, error) { if ctx == nil { ctx = context.Background() } //创建一个tcp网络 n := &tcpNetwork{ mu: sync.RWMutex{}, once: sync.Once{}, ctx: ctx,
tlsCfg: nil, loadPidFunc: nil, enableTls: true, lAddrList: make([]ma.Multiaddr, 0, 10), tcpListeners: make([]net.Listener, 0, 10),
closeChan: make(chan struct{}), lPID: "",
logger: logger, } //调用tcp网络的apply方法 if err := n.apply(opt...); err != nil { return nil, err } //检测tls配置 if err := n.checkTlsCfg(); err != nil { return nil, err }
if n.lPID == "" { return nil, ErrLocalPidNotSet }
return n, nil}复制代码
这里大量用到了选项设计模式,
//调用 tcp 网络的 apply 方法
if err := n.apply(opt...); err != nil {
return nil, err
}
func (t *tcpNetwork) apply(opt ...Option) error { for _, o := range opt { if err := o(t); err != nil { return err } } return nil}复制代码
这里可以明白,就是调用 Option 来给调用者设置参数
划线
评论
复制
发布于: 刚刚阅读数: 3
李
关注
还未添加个人签名 2018.05.04 加入
还未添加个人简介









评论