观摩一下Nano实现的Options——lonng/nano

设置选项,在使用的时候十分方便,只需要调用返回值为Option,形如WithXXX的方法即可。
同时,Option暴露在外面,可以很方便的查看支持哪些Option

nano.Listen(":3250",
		nano.WithIsWebsocket(true),
		nano.WithPipeline(pip),
		nano.WithCheckOriginFunc(func(_ *http.Request) bool { return true }),
		nano.WithWSPath("/nano"),
		nano.WithDebugMode(),
		nano.WithSerializer(json.NewSerializer()), // override default serializer
		nano.WithComponents(components),
)

实际上Option是个函数类型,

type Option func(*cluster.Options)

由于cluster.Options暴露在外面,是可以很清楚看到支持哪些选项的.


以下是刨根问底:

Listen只是简单地将将opts跑一遍,生成已设置的选项集合

func Listen(addr string, opts ...Option) {
	// ... ...
	opt := cluster.Options{
		Components: &component.Components{},
	}

	for _, option := range opts {
		option(&opt)
	}
	
	// ... ...
}

而WithXXX函数只是设置了单一的选项,然后返回匿名函数,来给Listen函数生成选项集合。

func WithPipeline(pipeline pipeline.Pipeline) Option {
	return func(opt *cluster.Options) {
		opt.Pipeline = pipeline
	}
}

你可能感兴趣的:(技术剖析,golang)