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

深碍√TFBOYSˉ_ 2023-07-07 08:29 85阅读 0赞

range

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

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

  1. for key, value := range oldMap {
  2. newMap[key] = value
  3. }



































  1st value 2nd value  
string index s[index] unicode, rune
array/slice index s[index]  
map key m[key]  
channel element    

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

  1. package main
  2. func main() {
  3. s := "abc"
  4. // 忽略 2nd value,支持 string/array/slice/map。
  5. println("忽略 2nd value,支持 string/array/slice/map")
  6. for i := range s {
  7. println(s[i])
  8. }
  9. // 忽略 index。
  10. println("忽略 index")
  11. for _, c := range s {
  12. println(c)
  13. }
  14. // 忽略全部返回值,仅迭代。
  15. println("忽略全部返回值,仅迭代")
  16. for range s {
  17. }
  18. m := map[string]int{"a": 1, "b": 2}
  19. // 返回 (key, value)。
  20. println("map返回 (key, value)")
  21. for k, v := range m {
  22. println(k, v)
  23. }
  24. // 返回结果
  25. //忽略 2nd value,支持 string/array/slice/map
  26. //97
  27. //98
  28. //99
  29. //忽略 index
  30. //97
  31. //98
  32. //99
  33. //忽略全部返回值,仅迭代
  34. //map返回 (key, value)
  35. //a 1
  36. //b 2
  37. }

注意,range 会复制对象。

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

输出结果:

  1. [0 999 999]
  2. [100 101 102]

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

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

另外两种引用类型 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 条评论,85人围观)

还没有评论,来说两句吧...

相关阅读

    相关 go - range

    go range go内置的关键字,用来在for循环中迭代可迭代的结构; 使用range求slice的和 numbers := [10]int sum

    相关 go 多重循环控制

    一 基本介绍 1 将一个循环放在另一个循环体内,就形成了嵌套循环。在外边的 for 称为外层循环,在里面的 for 循环称为内层循环。建议:一般使用两层,最多不要超过三层

    相关 go的for 循环控制

    一 基本介绍 听其名而知其意。就是让一段代码循环的执行。 二 一个实际的需求 1 编写一个程序, 可以打印 10 句"循环语句"。 a 使用传统的方式实现