在这种情况下,它没有很多代码,但是仍然困扰着我。我有一个共同的问题,那就是当尝试连接到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/

10-09 20:34