写点什么

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 来给调用者设置参数

用户头像

关注

还未添加个人签名 2018.05.04 加入

还未添加个人简介

评论

发布
暂无评论
network_factory.go源码分析_长安链_李_InfoQ写作社区