Go流程控制

Posted yzg-14

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go流程控制相关的知识,希望对你有一定的参考价值。

1. 顺序控制

程序从上往下执行,中间没有任何的判断和跳转。

2. 分支控制

2.1if单分支

技术图片

if age > 18 {
  fmt.Println("你年龄大于18,要对自己的行为负责!")
}


// golang支持在if中,直接定义一个变量,比如下面
if age := 20; age > 18 {
  fmt.Println("你年龄大于18,要对自己的行为负责!")
}

2.2 if双分支

技术图片

if age > 18 {
fmt.Println("==")
} else {  // else不能写在下一行
fmt.Println("====")
}

2.3 if多分支

技术图片

2.4 switch

技术图片

注意

技术图片

 技术图片

package main

import (
	"fmt"
)

// 写一个非常简单的函数
func test(char byte) byte {
	return char + 1
}

func main() {

	fmt.Println("请输入一个字符 a,b,c,d,e,f,g")
	fmt.Scanf("%c", &key)

	switch test(key) + 1 { // 将语法现象
	case ‘a‘:
		fmt.Println("周一, 猴子穿新衣")
	case ‘b‘:
		fmt.Println("周二,猴子当小二")
	case ‘c‘:
		fmt.Println("周三,猴子爬雪山")
		//...
	default:
		fmt.Println("输入有误...")
	}

	var n1 int32 = 51
	var n2 int32 = 20
	switch n1 {
	case n2, 10, 5: // case 后面可以有多个表达式
		fmt.Println("ok1")
	case 90:
		fmt.Println("ok2~")

	}

	// switch 后也可以不带表达式,类似 if --else分支来使用
	var age int = 10

	switch {
	case age == 10:
		fmt.Println("age == 10")
	case age == 20:
		fmt.Println("age == 20")
	default:
		fmt.Println("没有匹配到")
	}

	//case 中也可以对 范围进行判断
	var score int = 90
	switch {
	case score > 90:
		fmt.Println("成绩优秀..")
	case score >= 70 && score <= 90:
		fmt.Println("成绩优良...")
	case score >= 60 && score < 70:
		fmt.Println("成绩及格...")
	default:
		fmt.Println("不及格")
	}

	// switch 后也可以直接声明/定义一个变量,分号结束,不推荐

	switch grade := 90; { // 在golang中,可以这样写
	case grade > 90:
		fmt.Println("成绩优秀~..")
	case grade >= 70 && grade <= 90:
		fmt.Println("成绩优良~...")
	case grade >= 60 && grade < 70:
		fmt.Println("成绩及格~...")
	default:
		fmt.Println("不及格~")
	}

	// switch 的穿透 fallthrought
	var num int = 10
	switch num {
	case 10:
		fmt.Println("ok1")
		fallthrough // 默认只能穿透一层  // 立马输出ok2,不用判断
	case 20:
		fmt.Println("ok2")
		fallthrough
	case 30:
		fmt.Println("ok3")
	default:
		fmt.Println("没有匹配到..")
	}
}

3. 循环控制

3.1 for循环

技术图片

package main
import (
	"fmt" 
)

func main() {

	
	for i := 1; i <= 10; i++ {
		fmt.Println("你好,尚硅谷", i)
	}


	// for循环的第二种写法
	j := 1 //循环变量初始化
	for j <= 10 { //循环条件
		
		fmt.Println("你好,尚硅谷~", j)
		j++ //循环变量迭代
	}

	// for循环的第三种写法, 这种写法通常会配合break使用
	k := 1
	for {  // 这里也等价 for ; ; { 
		if k <= 10 {
			fmt.Println("ok~~", k)
		} else {
			break //break就是跳出这个for循环
		}
		k++
	}


	// 字符串遍历方式1-传统方式
	var str string = "hello,world!北京"
	for i := 0; i < len(str); i++ {
		fmt.Printf("%c 
", str[i]) // 使用到下标...
	}

	// 字符串遍历方式1-传统方式
	var str string = "hello,world!北京"
	str2 := []rune(str) // 就是把 str 转成 []rune
	for i := 0; i < len(str2); i++ {
		fmt.Printf("%c 
", str2[i]) // 使用到下标...
	}

	fmt.Println()
	// 字符串遍历方式2-for-range
	str = "abc~ok上海"
	for index, val := range str {
		fmt.Printf("index=%d, val=%c 
", index, val)
	}
}

3.2 for循环实现while循环

技术图片

 技术图片

package main
import "fmt"

func main(){

	// 使用while方式输出10句hello,world
	// 循环变量初始化
	var i int = 1
	for {
		if i > 10 { // 循环条件
			break // 跳出for循环,结束for循环
		}
		fmt.Println("hello,world", i)
		i++ // 循环变量的迭代
	}

	fmt.Println("i=", i)


	// 使用的do...while实现完成输出10句hello,ok
	var j int = 1
	for {
		fmt.Println("hello,ok", j)
		j++ // 循环变量的迭代
		if j > 10 {
			break // break 就是跳出for循环
		}
	}	
}

3.3 for循环打印金字塔

package main

import "fmt"

func main() {

	var totalLevel int = 10
	for i := 1; i <= totalLevel; i++ {
		// 在打印*前先打印空格
		for k := 1; k <= totalLevel - i; k++ {
			fmt.Print(" ")
		}

		// j 表示每层打印多少*
		// 第一层1个* 第二层3个* 第三层5个* 第四层7个*
		// j在等于1的时候或者1*i-1或者totalLevel的时候打印*,否则打印空格
		for j :=1; j <= 2 * i - 1; j++ {
			if j == 1 || j == 2 * i - 1 || i == totalLevel {
				fmt.Print("*")  // 不会换行
			} else {
				fmt.Print(" ")
			}
		}
		fmt.Println()  // 换行
	}
}

3.4 for打印99乘法表

package main

import "fmt"

func main() {
	// 1*1=1
	// 2*1=2 2*2=4
	// 3*1=3 3*2=6 3*3=9
	// i 表示第几层, j表示从1到i
	for i := 1; i < 10; i++{
		for j := 1; j <= i; j++{
			fmt.Printf( "%v*%v=%v  ", i, j, i*j)  // 注意这里是Printf
		}
		fmt.Println()
	}

}

  

以上是关于Go流程控制的主要内容,如果未能解决你的问题,请参考以下文章

Go之路三:流程控制

go语言学习笔记 — 基础 — 控制流:流程控制

Go语言系列-03-流程控制语句

Go语言基础之流程控制

Go语言基础之流程控制

go——流程控制