如何在golang中编写DRY和有效的if语句?

时间:2018-01-22 08:11:26

标签: if-statement go

我有以下代码:

func main() {
    // counts := make(map[string]int)
    files := os.Args[1:]
    if len(files) == 0 {
        counts := make(map[string]int)
        countLines(os.Stdin, counts)
        fmt.Println("os.Stdin")
        printCounts(counts)
    } else {
        for _, arg := range files {
            counts := make(map[string]int)

            f, err := os.Open(arg)
            if err != nil {
                fmt.Fprintf(os.Stderr, "dup2: %v\n", err)
                continue
            }
            countLines(f, counts)
            f.Close()
            // print counts of each file
            printCounts(counts)
        }
    }
}
func printCounts(counts map[string]int) {
    //...
}
func countLines(f *os.File, counts map[string]int){
    //...
}

我在if-else语句中通过启动计数dict两次重复自己, (counts := make(map[string]int))in if和else。

我的问题是写这个的地鼠的方式是什么?

使用new在if-else语句之外进行分配并在每个块中执行启动会更好吗?

1 个答案:

答案 0 :(得分:1)

我的代码中没有多少重复。你可以以某种方式合并if和else部分,但我不是粉丝。

一个简单的重构就是将counts初始化移动到countLines函数中并使其返回。

func countLines(f *os.File, counts map[string]int)

- >

func countLines(f *os.File) map[string]int

在做很多事情之前不要多考虑分配(假设至少有100K分配)并在进行少量优化之前对代码进行分析。地图不仅会在make上分配内存,而且还会在您附加内存并且哈希表已满。