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 加入
还未添加个人简介
评论