
在Go语言中,空白标识符 _ 被广泛用于丢弃不需要的值。 然而,在循环中不当使用可能会导致编译错误,例如 "no new variables on left side of :="。 解决这个问题的方法是省略空白标识符的初始化,即使用 for _ = range ... 而不是 for _, ... := range ...。
问题分析
当你在循环中使用短变量声明 := 时,Go编译器会尝试声明新的变量。如果在同一个作用域内,你已经声明过同名变量,并且你没有同时声明任何新的变量,编译器就会报错。 在你的例子中,第二个 for 循环尝试使用 _ := range flag.Args(),但 _ 已经在第一个 for 循环中被声明过。 由于第二个循环没有声明任何新的变量,编译器就抛出了错误。
解决方案
立即学习“go语言免费学习笔记(深入)”;
正确的写法是使用赋值操作符 =,而不是短变量声明操作符 :=。 这样,编译器就不会尝试声明新的变量,而是将循环的索引或键值赋给已经存在的空白标识符 _。
示例代码
以下是修正后的代码:
package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"sync"
)
var walkend chan bool
var walkerrs chan error
var dupes map[string][]string
var mu sync.Mutex
func main() {
flag.Parse()
walkend = make(chan bool, len(flag.Args()))
walkerrs = make(chan error, len(flag.Args()))
dupes = make(map[string][]string)
var wg sync.WaitGroup
wg.Add(len(flag.Args()))
for _, arg := range flag.Args() {
go func(arg string) {
defer wg.Done()
err := filepath.Walk(arg, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.Mode().IsRegular() {
return nil
}
content, err := os.ReadFile(path)
if err != nil {
return err
}
hash := string(content) // In a real application, use a proper hash function.
mu.Lock()
dupes[hash] = append(dupes[hash], path)
mu.Unlock()
return nil
})
if err != nil {
walkerrs <- err
}
walkend <- true
}(arg)
}
go func() {
wg.Wait()
close(walkend)
close(walkerrs)
}()
for _ = range flag.Args() { // Corrected line
select {
case <-walkend:
// Walk completed successfully
case err := <-walkerrs:
fmt.Fprintf(os.Stderr, "Error during walk: %v\n", err)
os.Exit(1)
}
}
for hash, paths := range dupes {
if len(paths) > 1 {
fmt.Printf("Duplicate files with hash %s:\n", hash)
for _, path := range paths {
fmt.Printf(" - %s\n", path)
}
}
}
}代码解释
注意事项
总结
通过使用赋值操作符 = 而不是短变量声明操作符 :=,可以避免在Go语言循环中使用空白标识符时遇到的 "no new variables on left side of :=" 错误。 这种方法可以让你简洁地忽略循环的索引或键值,而只关注循环的迭代过程。 掌握这个技巧可以帮助你编写更清晰、更高效的Go代码。
以上就是如何在Go语言中使用空白标识符进行循环迭代的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号