天天看點

觀摩一下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是個函數類型,

由于

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
	}
}