六、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)
    }
  }
}
相关推荐
Nyarlathotep01133 小时前
gin01:初探gin的启动
后端·go
怕浪猫4 小时前
第21章:微服务与分布式架构中的Go应用
后端·go·编程语言
阿里云云原生19 小时前
5 分钟零代码改造,让 Go 应用自动获得全链路可观测能力
云原生·go
Coding君1 天前
每日一Go-30、Go语言进阶-现代化部署:容器化与Docker
go
子玖1 天前
go实现通过ip解析城市
后端·go
Das1_1 天前
【Golang 数据结构】Slice 底层机制
后端·go
太凉2 天前
select 语句详解
go
想用offer打牌2 天前
一站式了解四种限流算法
java·后端·go
怕浪猫2 天前
第20章:Web服务实战——构建RESTful API
后端·go·编程语言
Coding君3 天前
每日一Go-28、Go语言进阶-深入Go运行时:内存管理与GC
go