六、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)
    }
  }
}
相关推荐
踏着七彩祥云的小丑12 小时前
Go学习第3天:变量+常量+运算符
开发语言·学习·golang·go
踏着七彩祥云的小丑2 天前
Go学习第2天:程序结构+基础语法+数据类型
开发语言·学习·golang·go
吴佳浩2 天前
AI Infra 的真相:Go 没输,rust也不是取代
后端·rust·go
2601_959644892 天前
2026年权威AI引擎优化服务咨询,专业之选
go
逐光老顽童2 天前
用 Go 实现一个 LLM 路由网关:Thompson Sampling 与自适应故障转移实践
vue.js·go
蓝宝石的傻话2 天前
MiBeeNvr v0.6.0: 延时摄影 + 转码界面 + ONVIF 增强 + 文档重构
go·github
先跑起来再说2 天前
Go 排行榜系统的工程化实现:分布式锁、快照表与定时刷新
分布式·go·gin
SenChien3 天前
Golang入门学习笔记
golang·go
唐青枫3 天前
别再把 make 和 new 搞混:Go make 从切片到通道实战详解
go
协享科技3 天前
前端 SSE 流式响应处理实践:从接收、解析到渲染
前端·人工智能·程序人生·go·ai编程·sse