六、Go语法基础(条件控制和循环控制)

Golang中文学习文档地址

1、条件控制

go中,存在三个条件控制的关键字:if else、swtich、select。

1.1 if else:使用和其他开发语言差不多。

go 复制代码
if 表达式 { //表达式必须返回一个布尔值
    //do someing
} else {
    //or do someing
}

1.2 switch

  • switch语句格式:
go 复制代码
switch expr {
      case case1:
        statement1
      case case2:
        statement2
      default:
        default statement
    }
  • fallthrough关键字:作用:继续执行下一个分支
go 复制代码
func main() {
   num := 2
   switch {
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
      fallthrough // 执行完该分支后,会继续执行下一个分支
   case num < 0:
      num += num 
   }
   fmt.Println(num)
}

1.4 select

select在并发中使用。

select 语句只能用于通道(Channel)操作,每个 case 必须是一个通道操作,要么是发送要么是接收。

go 复制代码
package main

func main() {

    chan1 := make(chan int)//创建一个channel
    chan2 := make(chan int)
    //创建一个协程
    go func() {
       chan1 <- 1
    }()
    //创建一个协程
    go func() {
       chan2 <- 2
    }()
    for true {
       select {
       case v1 := <-chan1:
          // 当chan1有值写入时,执行
          println("chan1:", v1)
       case v2 := <-chan2:
          // 当chan2有值写入时,执行
          println("chan2:", v2)
       default:
          break
       }
    }

}

1.5 label

  • 标签语句,可以结合gotobreakcontinue的目标。

    给某段代码块进行打标签,后续可以通过goto等关键字,将代码执行流程跳转到该段代码。 标签只标注了位置,而不是包含某一段代码,只是为了goto等关键字将当前的执行位置,跳转到标签后,从该标签的位置继续执行。

go 复制代码
package main

import "fmt"

func main() {
	num := 1
	if num < 10 {
		fmt.Println("goto A")
		goto A //执行跳转到A标签所在代码块,从A标签位置继续往下执行
	}
	//因以上条件已经跳转到标签A的位置,所以该代码块不能被执行
	if num > 10 {
		fmt.Println("goto B")
		goto B
	}
A:
	fmt.Println("start A")
	num += 10

B:
	//标签只标注了位置,所以从标签A继续往下执行,该代码块也会被执行
	fmt.Println("start B")
	num -= 10

	fmt.Println(num, " end num")
}

//执行结果
//goto A
//start A
//start B
//1  end num

1.6 goto

  • 结合label标签使用,将控制权传递给在同一函数对应标签的位置。
  • 通过labelgoto结合使用,也能够在一定程度上实现循环控制。
go 复制代码
func main() {
   a := 1
   if a == 1 {
      goto A
   } else {
      fmt.Println("b")
   }
A:
   fmt.Println("a")
}
//输出结果
//a

2、 循环控制

  • 在Go中有且只有一个中循环控制:for,没有像Java中的while。

2.1 for

  • 表达式
go 复制代码
for init statement; expression; post statement {
  execute statement
}
  • 使用案例
go 复制代码
func main() {
	for i := 1; i < 10; i++ {
            fmt.Printf("num:%d\n", i)
	}
}
  • for循环只保留表达式,就变成其他语言中的while
go 复制代码
func main() {
	i := 1
	for i <= 10 {
		fmt.Println(i)
		i++
	}
}

2.2 for range

  • for range可以更加方便的遍历一些可迭代的数据结构,如数组,切片,字符串,映射表,通道。
go 复制代码
for index, value := range iterable { //index:迭代的索引,value:索引下对应的值
  // do someing
}

2.3 break

  • break关键字会终止最内层的for循环。
go 复制代码
func main() {
  for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
      if i <= j {
        break
      }
      fmt.Println(i, j)
    }
  }
}

2.4 continue

  • continue关键字会跳过最内层循环的本次迭代,直接进入下一次迭代。
go 复制代码
func main() {
  for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
      if i > j {
        continue
      }
      fmt.Println(i, j)
    }
  }
}
  • 还可以结合标签(label),跳转到相应的标签位置。
go 复制代码
func main() {
Out:
  for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
      if i > j {
        continue Out
      }
        fmt.Println(i, j)
    }
  }
}
相关推荐
百锦再41 分钟前
第14章 智能指针
android·java·开发语言·git·rust·go·错误
Mgx3 小时前
用 Go 写个“端口扫描器”,100 行代码扫描你家路由器?(别慌,只是看看谁在开门!)
go
mao毛4 小时前
go项目适配DTM,gozero已经适配dtm了,goframe项目要怎么适配?
微服务·go
Mgx7 小时前
一文讲透 Go 的 defer:你的“善后管家“,别让他变成“背锅侠“!
go
Mgx8 小时前
剪贴板监控记:用 Go 写一个 Windows 剪贴板监控器
go
百锦再15 小时前
第11章 泛型、trait与生命周期
android·网络·人工智能·python·golang·rust·go
百锦再19 小时前
第12章 测试编写
android·java·开发语言·python·rust·go·erlang
Mgx2 天前
你知道程序怎样优雅退出吗?—— Go 开发中的“体面告别“全指南
go
光头闪亮亮3 天前
电子发票解析工具-golang服务端开发案例详解
go
Mgx3 天前
从“CPU 烧开水“到优雅暂停:Go 里 sync.Cond 的正确打开方式
go