Go for range 和 goto
for range
for range 是 Go 语言中用于遍历集合的一种特殊形式的 for 循环。
简化遍历
for range 提供了一种简单的语法,可以遍历数组、切片、字符串、映射和通道,无需手动管理索引或使用迭代器。
返回两个值
在迭代数组、切片和字符串时,range 返回两个值。第一个是索引(或键),第二个是该位置的值。对于映射,第一个值是键,第二个值是对应的值。对于通道,它只返回通道内的元素。
灵活的返回
如果不需要索引或键,可以使用空白标识符 _ 来忽略它。如果只需要索引,可以完全忽略第二个变量。
package main
import "fmt"
func main() {
// 遍历数组或切片
numbers := []int{2, 4, 6, 8}
for index, value := range numbers {
fmt.Printf("索引 %d,值 %d\n", index, value)
}
// 忽略索引
for _, value := range numbers {
fmt.Println("值", value)
}
// 遍历映射
scores := map[string]int{"Alice": 90, "Bob": 80}
for name, score := range scores {
fmt.Printf("姓名 %s,分数 %d\n", name, score)
}
// 遍历字符串
for index, char := range "Go语言" {
fmt.Printf("索引 %d,字符 %c\n", index, char)
}
// 遍历通道
channel := make(chan int)
go func() {
channel <- 2
channel <- 4
close(channel)
}()
for value := range channel {
fmt.Println("接收到", value)
}
}
goto
在 Go 语言中,goto 语句很少使用,我建议使用 return 来终止循环,以提高代码的可读性。
package main
import "fmt"
func main() {
userName := `sumingcheng`
passWord := `123456`
for _, pwChar := range passWord {
for _, usChar := range userName {
if usChar == pwChar {
fmt.Print("有重复字符")
return
}
}
}
}
注意事项
尽量避免使用 goto,以保持代码结构清晰。
使用 for range 遍历切片或数组时,循环变量是值的拷贝。如果需要修改原始数据,请使用索引访问。
在遍历映射时,需要注意映射的遍历顺序是不确定的。