Go语言流程控制语句

Go语言中最常用的流程控制语句有 iffor ,没有像Python中的while语句。另外,Go语言还有switchgoto语句,不过这两个主要是用来简化代码的,属于扩展类的流程控制,使用率没有iffor多。

if语句

if语句的基本格式

if 表达式1 {
分支1
} else if 表达式2 {
分支2
} else {
分支3
} // 表达式1为true时,执行分支1
// 表达式1为false时。判断表达式2,为true则执行分支2
// 如果表达式1和表达式2都为false时,执行分支3

if 单分支

package main

import (
"fmt"
) func main() {
// 声明一个变量
alnkAge := 18 if alnkAge >= 18 {
// 条件满足走这个分支
fmt.Println("年轻人")
} // 代码从上到下执行
fmt.Println("代码执行结束")
}
lichengguo@lichengguodeMacBook-Pro % go run main.go
年轻人
代码执行结束

if-else 双分支

package main

import (
"fmt"
) func main() {
// 声明一个变量
alnkAge := 17 if alnkAge >= 18 {
// 条件满足走这个分支
fmt.Println("年轻人")
} else {
// 如果上一个条件不满足,则走这个分支
fmt.Println("小孩子")
} // 代码从上到下执行
fmt.Println("代码执行结束")
}
lichengguo@lichengguodeMacBook-Pro % go run main.go
小孩子
代码执行结束

if-else if-else 多分支

package main

import (
"fmt"
) func main() {
// 声明一个变量
alnkAge := 17 if alnkAge >= 35 {
// 条件满足走这个分支
fmt.Println("中年人")
} else if alnkAge >= 18 {
// 如果上一个条件不满足,则走这个分支
fmt.Println("骚年")
} else {
// 如果前面2个条件都不满足,则走这个分支
fmt.Println("学生")
} // 代码从上到下执行
fmt.Println("代码执行结束")
}
lichengguo@lichengguodeMacBook-Pro % go run main.go
学生
代码执行结束

其他的if情况

package main

import (
"fmt"
) func main() {
// 在if语句这一行先声明一个变量,然后在进行判断
// 这里涉及到一个新知识点 变量作用域
// 此时的 变量alnkAge 只在if语句这个作用域内有效
if alnkAge := 18; alnkAge > 18 {
fmt.Println("大于18岁")
} else {
fmt.Println("学生")
} // fmt.Println(alnkAge) // 会报错 undefined: alnkAge
}

作用域:变量可以使用的范围

  • 局部变量:函数内部、或者流程控制语句内部定义的变量,就叫做局部变量。局部变量在哪里定义,就只能在该范围内使用,如果在其他范围使用,则会报错

  • 全局变量:在函数、流程控制语句等外部定义的变量,就叫做全局变量。所有范围都可以使用全局变量。

变量作用域查找顺序:遵循LEGB原则(和Python一样)

  • L : local 局部作用域
  • E : enclose 嵌套作用域(函数中包含一个函数)
  • G : global 全局作用域
  • B : built in 内置作用域
package main

import (
"fmt"
) // 全局变量的定义
//name1 := "Alnk" // 全局变量的定义不支持简短声明
var name1 = "Alnk" // 定义一个全局变量 // 在函数内部定义一个局部变量
func test() {
// 定义一个局部变量
var name2 = "Alnk2"
fmt.Println(name2)
} func main() {
fmt.Println(name1) // 在 main 函数内部使用全局变量 // 在 main 函数中不能使用 test 函数定义的局部变量。因为不在同一个作用域
//fmt.Println(name2)
}

for语句

for循环语句的基本格式

for 初始语句; 条件表达式; 结束语句 {
循环体语句
} // 条件表达式为true时,会一直循环,知道条件表达式为false时,退出循环

基本循环格式

package main

import (
"fmt"
) // 最常用的for循环格式 func main() {
// 基本循环格式
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}

异形格式1

package main

import (
"fmt"
) // 这种格式不常用 func main() {
// 复习一下作用域
i := 5
for ; i < 10; i++ {
// 这里的for循环里面为什么能找到变量i呢?参考LEGB原则
// 首先会在for这个代码块的局部作用域中寻找i变量
// 如果没找到,则会去上一层的嵌套作用域查找 这里是main函数内部
// 如果还没找到,则会去全局作用域查找
// 最后再去内置作用局查找,如果还没找到,则会报错
fmt.Println(i)
}
}

异形格式2

package main

import (
"fmt"
) func main() {
// 不常用
i := 5
for i < 10 {
fmt.Println(i)
i++
}
}

for死循环

package main

import (
"fmt"
) // 比较常用
// 用来hang住程序,不让程序退出
// ctrl+c 退出程序 func main() {
for {
fmt.Println("Alnk")
}
}

for range 循环

package main

import (
"fmt"
) // 常用 func main() {
s := "hello,你好"
for index, value := range s {
fmt.Printf("%d - %c\n", index, value)
}
}

跳出for循环

break

package main

import (
"fmt"
) func main() {
// 当i=5时就跳出for循环
for i := 0; i < 10; i++ {
if i == 5 {
break // 直接跳出整个for循环
}
fmt.Println(i)
}
fmt.Println("over")
}

continue

package main

import (
"fmt"
) func main() {
// 当i=5时,跳过此次for循环(不执行for循环内部的打印语句),
// 继续下一次循环
for i := 0; i < 10; i++ {
if i == 5 {
continue // 跳过本次循环,执行下一次循环
}
fmt.Println(i)
}
fmt.Println("over")
}

switch语句

switch语句主要是用来简化大量的判断,一个变量和具体的值作比较

单个值匹配

package main

import (
"fmt"
) func main() {
//n := 2
//if n == 1 {
// fmt.Println("1")
//} else if n == 2 {
// fmt.Println("2")
//} else if n == 3 {
// fmt.Println("3")
//} else if n == 4 {
// fmt.Println("4")
//} else if n == 5 {
// fmt.Println("5")
//} else {
// fmt.Println("No")
//} // 可以看出上面的if-else分支太多,导致代码可读性变差
n := 2
switch n {
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
case 3:
fmt.Println("3")
case 4:
fmt.Println("4")
case 5:
fmt.Println("5")
default:
fmt.Println("No")
}
}

多个值匹配

package main

import (
"fmt"
) func main() {
//多个匹配值
n1 := 7
switch n1 {
case 1, 3, 5, 7, 9:
fmt.Println("奇数")
case 2, 4, 6, 8:
fmt.Println("偶数")
default:
fmt.Println(n1)
} // 也可以在switch代码块中声明变量并且判断
switch n2 := 8; n2 {
case 1, 3, 5, 7, 9:
fmt.Println("奇数")
case 2, 4, 6, 8:
fmt.Println("偶数")
default:
fmt.Println(n1)
}
}

goto语句

goto语句用来跳转到指定的标签位置,不建议使用,会影响代码的可读性

如果要跳出多层for循环,用标记位

package main

import (
"fmt"
) func main() {
// 用标记位, 跳出多层for循环
flag := false for i := 0; i < 10; i++ {
for j := 'A'; j < 'Z'; j++ {
if j == 'C' {
flag = true
break // 跳出内层的for循环
}
fmt.Printf("%v-%c\n", i, j)
}
if flag {
break // 跳出外层的for循环
}
}
}
package main

import (
"fmt"
) func main() {
// goto+label(标签) 实现跳出多层for循环(不建议使用)
for i := 0; i < 10; i++ {
for j := 'A'; j < 'Z'; j++ {
if j == 'C' {
goto XX // 跳到指定的那个标签
}
fmt.Printf("%v-%c\n", i, j)
}
}
XX: // label(标签)
fmt.Println("over")
}

实践练习

  • 编写代码分别定义一个整型、浮点型、布尔型、字符串型变量,使用fmt.Printf()搭配%T分别打印出上述变量的值和类型
  • 编写代码统计出字符串"hello你好呀Alnk" 中的汉字的数量
  • 打印一个九九乘法表
package main

import (
"fmt"
"unicode"
) func main() {
//1
//i1 := 10
//f1 := 1.234
//b1 := true
//s1 := "hello沙河"
//fmt.Printf("%T %d\n", i1, i1)
//fmt.Printf("%T %f\n", f1, f1)
//fmt.Printf("%T %v\n", b1, b1)
//fmt.Printf("%T %s\n", s1, s1) //2
s := "hello你好呀Alnk"
result := chineseCount(s)
fmt.Println(result) //3 九九乘法表
multiplicationTable() } func chineseCount(str1 string) (count int) {
for _, char := range str1 {
if unicode.Is(unicode.Han, char) {
count++
}
}
return
} func multiplicationTable() {
for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d * %d = %d\t", j, i, j*i)
}
fmt.Println()
}
}

Golang语言系列-03-流程控制语句的更多相关文章

  1. java与.net比较学习系列(5) 流程控制语句

    java中流程控制语句主要分为以下几类,第一,条件语句,主要包括if语句和switch语句.第二,循环语句,主要包括while循环语句,for循环语句.第三,跳转语句,主要包括三种,break跳出语句 ...

  2. Golang语言系列-10-包

    包 自定义包 package _0calc import ( "fmt" ) /* [Go语言的包] 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基 ...

  3. Sql Server系列:流程控制语句

    T-SQL中用来编写流程控制模块的语句有:BEGIN...AND语句.IF...ELSE语句.CASE语句.WHILE语句.GOTO语句.BREAK语句.WAITFOR语句和RETURN语句. 1 B ...

  4. Golang语言系列-14-单元测试

    单元测试 字符串切割函数 package split_string import ( "fmt" "strings" ) // Split:切割字符串 // e ...

  5. Golang语言系列-11-goroutine并发

    goroutine 并发 概念 package main import ( "fmt" "time" ) /* [Go语言中的并发编程 goroutine] [ ...

  6. Golang语言系列-07-函数

    函数 函数的基本概念 package main import ( "fmt" ) // 函数 // 函数存在的意义:函数能够让代码结构更加清晰,更简洁,能够让代码复用 // 函数是 ...

  7. Golang语言系列-01-Go语言简介和变量

    Go语言简介 Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pi ...

  8. Golang语言系列-17-Gin框架

    Gin框架 Gin框架简介 package main import ( "github.com/gin-gonic/gin" "io" "net/ht ...

  9. Golang语言系列-15-数据库

    数据库 MySQL 连接数据库 package main import ( "database/sql" "fmt" _ "github.com/go ...

随机推荐

  1. 包机制与javaDOC文档

    包机制 包的本质就是个文件夹: 一般利用公司域名倒置作为包名:com.kuangstudy.biog javaDOC文档 package com.kuang.base; /** * @author K ...

  2. Java:java -jar命令讲解

    1. 当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 #正常启动jar包 java -jar XXX.jar#当前ssh窗口被锁定,可按CTRL + C打断程序运行, ...

  3. Game游戏分析

    1.鲁棒图分析 2.系统上下文及交互方式 3.用例 4.逻辑拓扑图 5.物理拓扑图 6.时序图 7.状态图 8.物理数据模型 9.类图 10.技术选型 11.框架搭建 12.工具及通用服务 13.架构 ...

  4. Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法

    联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为 ...

  5. 被swoole坑哭的PHP程序员 (转)

    本文主要记录一下学习swoole的过程.填过的坑以及swoole究竟有多么强大! 首先说一下对swoole的理解:披着PHP外衣的C程序.很多PHPer朋友看到swoole提供的强大功能.外界对其的崇 ...

  6. Jquery Validate自定义验证规则,一个汉字等于两个字符长度

    使用Jquery validate时写的一些东西,在这里做个笔记 在使用 Jquery validate 的minlength和maxlength进行文本框内容长度验证的时候,对于一个汉字的长度检测结 ...

  7. 不同版本docker修改存储位置补充

    前言:最近发现yum安装docker,安装的版本不一样,有点蛇皮,虽然存放默认位置都是/var/lib/docker,但是它的配置文件不一样,这里做个补充 对于docker版本是1.13及以下 操作如 ...

  8. git使用---安装,提交,回退,修改,分支,标签等

    下面是对git的各种使用及命令的基础使用,来自廖雪峰老师的git教程,这个收录下,作为git的使用总结. github上面地址为:https://github.com/Zhangguoliu/lear ...

  9. jar\war\SpringBoot加载包内外资源的方式,告别FileNotFoundException吧

    工作中常常会用到文件加载,然后又经常忘记,印象不深,没有系统性研究过,从最初的war包项目到现在的springboot项目,从加载外部文件到加载自身jar包内文件,也发生了许多变化,这里开一贴,作为自 ...

  10. SQLITE数据库不支持远程访问

    SQLITE数据库不支持远程访问 import sqlite3 conn=sqlite3.connect("dailiaq.db") cur=conn.cursor() def c ...