六、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)
    }
  }
}
相关推荐
研究司马懿19 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大1 天前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰2 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘2 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤2 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto4 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo