Go基础:range、循环控制Goto、Break、Continue

简介: Go基础:range、循环控制Goto、Break、Continue

range


Golang range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

for key, value := range oldMap {
    newMap[key] = value
}
  1st value 2nd value  
string index s[index] unicode, rune
array/slice index s[index]  
map key m[key]  
channel element    

可忽略不想要的返回值,或 "_" 这个特殊变量。

package main
func main() {
  s := "abc"
  // 忽略 2nd value,支持 string/array/slice/map。
  println("忽略 2nd value,支持 string/array/slice/map")
  for i := range s {
    println(s[i])
  }
  // 忽略 index。
  println("忽略 index")
  for _, c := range s {
    println(c)
  }
  // 忽略全部返回值,仅迭代。
  println("忽略全部返回值,仅迭代")
  for range s {
  }
  m := map[string]int{"a": 1, "b": 2}
  // 返回 (key, value)。
  println("map返回 (key, value)")
  for k, v := range m {
    println(k, v)
  }
  // 返回结果
  //忽略 2nd value,支持 string/array/slice/map
  //97
  //98
  //99
  //忽略 index
  //97
  //98
  //99
  //忽略全部返回值,仅迭代
  //map返回 (key, value)
  //a 1
  //b 2
}


注意,range 会复制对象。

package main
import "fmt"
func main() {
    a := [3]int{0, 1, 2}
    for i, v := range a { // index、value 都是从复制品中取出。
        if i == 0 { // 在修改前,我们先修改原数组。
            a[1], a[2] = 999, 999
            fmt.Println(a) // 确认修改有效,输出 [0, 999, 999]。
        }
        a[i] = v + 100 // 使用复制品中取出的 value 修改原数组。
    }
    fmt.Println(a) // 输出 [100, 101, 102]。
}

输出结果:

    [0 999 999]
    [100 101 102]

建议改用引用类型,其底层数据不会被复制。

package main
func main() {
    s := []int{1, 2, 3, 4, 5}
    for i, v := range s { // 复制 struct slice { pointer, len, cap }。
        if i == 0 {
            s = s[:3]  // 对 slice 的修改,不会影响 range。
            s[2] = 100 // 对底层数据的修改。
        }
        println(i, v)
    }
}

另外两种引用类型 map、channel 是指针包装,而不像 slice 是 struct。


for 和 for range有什么区别?

主要是使用场景不同

for可以

遍历array和slice

遍历key为整型递增的map

遍历string

for range可以完成所有for可以做的事情,却能做到for不能做的,包括

遍历key为string类型的map并同时获取key和value

遍历channel


循环控制Goto、Break、Continue

循环控制语句

循环控制语句可以控制循环体内语句的执行过程。

GO 语言支持以下几种循环控制语句:

1.1.1. Goto、Break、Continue

  1. 三个语句都可以配合标签(label)使用
  2. 标签名区分大小写,定以后若不使用会造成编译错误
  3. continue、break配合标签(label)可用于多层循环跳出
  4. goto是调整执行位置,与continue、break配合标签(label)的结果并不相同


参考链接:

http://www.topgoer.com/%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6/%E5%BE%AA%E7%8E%AF%E6%8E%A7%E5%88%B6gotobreakcontinue.html



目录
打赏
0
0
0
0
3335
分享
相关文章
|
2月前
|
Go
跳转语句:break、continue、goto -《Go语言实战指南》
本文介绍了 Go 语言中的三种跳转语句:`break`、`continue` 和 `goto`。`break` 用于跳出当前循环或选择结构,如 `for`、`switch` 和 `select`;`continue` 跳过当前循环的剩余部分并进入下一轮;`goto` 实现无条件跳转到指定标签,但需慎用以保持代码清晰。通过示例代码展示了它们的具体用法,并建议优先使用 `break` 和 `continue`,仅在特定场景(如资源清理)下考虑 `goto`。
|
8月前
|
Go
go语言中在 for 循环中使用 break
go语言中在 for 循环中使用 break
135 4
|
7月前
|
go语言使用range关键字
go语言使用range关键字
86 7
|
8月前
|
go语音中range 循环
go语音中range 循环
111 12
|
8月前
|
go语言使用 range 关键字
go语言使用 range 关键字
82 3
go语言使用 range 关键字遍历
go语言使用 range 关键字遍历
101 3
|
8月前
|
go语言在 switch 语句中使用 break
go语言在 switch 语句中使用 break
239 5
|
8月前
|
Go
go语言标签化的 break
go语言标签化的 break
84 2
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等