在这种情况下,它没有很多代码,但是仍然困扰着我。我有一个共同的问题,那就是当尝试连接到IP时,如果失败,我应该重试下一个IP。
我有一个函数可以为NSQ生成一个生成器:
//Since we are in a critical system, we try with each IP until we get a producer
var err error
for i, success := 0, false; i < len(ips) && !success; i++ {
publisher, err = nsq.NewProducer(ips[i], nsq.NewConfig())
if err == nil {
success = true
}
}
几乎共享相同代码的另一个函数是一个使用NSQ使用者并将其连接的函数:
var err error
for i, success := 0, false; i < len(ips) && !success; i++ {
err = consumer.ConnectToNSQD(ips[i])
if err == nil {
success = true
}
}
我想在不牺牲易读性的情况下摆脱几乎重复的代码。有想法吗?
最佳答案
你有倒退。您的解决方案应该遵循问题的形式,而不是特定解决方案的形式。解决方案中没有值得重构的东西。这只会增加毫无意义的复杂性。
例如,
package main
import "github.com/nsqio/go-nsq"
// NewProducer is nsq.NewProducer with retries of an address list.
func NewProducer(addrs []string, config *nsq.Config) (producer *nsq.Producer, err error) {
if len(addrs) == 0 {
addrs = append(addrs, "")
}
for _, addr := range addrs {
producer, err = nsq.NewProducer(addr, config)
if err == nil {
break
}
}
return producer, err
}
// ConnectToNSQD is nsq.ConnectToNSQD with retries of an address list.
func ConnectToNSQD(c *nsq.Consumer, addrs []string) (err error) {
if len(addrs) == 0 {
addrs = append(addrs, "")
}
for _, addr := range addrs {
err = c.ConnectToNSQD(addr)
if err == nil {
break
}
}
return err
}
func main() {}
关于go - 几乎重复我自己,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32689816/