Golang学习笔记 控制流

条件语句

if语句

下面是Golang的if语句,需要注意的是条件判断块不需要小括号,而且if语句的大括号不能省略,即使其中只有一行语句。

if condition == true {
    fmt.Println("条件为真")
} else {
    fmt.Println("条件为假")
}

if语句可以包含一个初始化块,初始化块和判断条件中使用;分隔。初始化块用来初始化可能在语句中使用的变量,这些变量的作用域是if语句。

if i := 0; i == 0 {
    fmt.Println("i==0")
} else {
    fmt.Println("i!=0")
}

switch语句

如果需要多重条件判断,可以使用switch语句。和if语句一样,switch语句可以拥有一个初始化块。而且在switch语句中,case子句是默认中断的,也就是说,如果匹配到了某个case子句,就不会执行其他语句,而是直接结束。如果希望执行某个case子句之后继续执行下面的其他子句,需要使用fallthrough关键字。

switch x := 0; x {
case 0:
    fmt.Println(0)
case 1:
    fmt.Println(1)
case 2:
    fallthrough
case 3:
    fmt.Println("2<=x<=3")
default:
    fmt.Println("other")
}

switch语句可以没有条件,这时候相当于switch true。这是一种非常方便的声明多级if-else语句的方式。

var i = 0
//没有代码块默认为switch true,相当于多级if-else
switch {
case i == 0:
    fmt.Println("i==0")
case i == 1:
    fmt.Println("i==1")
default:
    fmt.Println("other")
}

循环语句

for循环

除了不使用小括号之外,Golang的for循环和其他语言的没什么区别。

for i := 0; i < 5; i++ {
    fmt.Print(i)
}
fmt.Println()

for循环(while)

for循环可以省略循环前后语句,只留下条件判断。

i = 0
for ; i < 1000; {
    i++
}

这时候可以省略前后分号,这种情况下for循环和while循环等价。

i := 0
for i < 1000 {
    i++
}

如果要使用无限循环,把整个条件块去掉就行了。

i = 0
//无限循环
for {
    if i == 500 {
        break
    }
    i++
}

推迟语句(Defer)

Golang官方教程把这个推迟语句也放到了控制流里面,不过我不知道合适不合适。所谓推迟语句,会在当前语句所在的代码块结束的时候执行。所以,推迟语句常常用来释放代码中使用的资源。如果代码块中有多个推迟语句,会按照从后到前的方式依次执行。

所以,在代码中每使用一个资源,我们只要马上紧接着写对应的释放语句,在代码块结束之后就能以完美的方式释放资源了。

func deferStatement() {
    //推迟语句,该语句会在所在代码块结束时调用
    //推迟语句的参数求值是立即求值的,只有调用是推迟的
    //如果存在多个推迟语句,按照站的方式执行,即前面的语句后执行
    fmt.Println("使用了资源1")
    defer fmt.Println("释放了资源1")

    fmt.Println("使用了资源2")
    defer fmt.Println("释放了资源2")

    fmt.Println("使用了资源3")
    defer fmt.Println("释放了资源3")

    fmt.Println("使用这些资源处理数据")
}

上面这段代码的执行结果很完美。

使用了资源1
使用了资源2
使用了资源3
使用这些资源处理数据
释放了资源3
释放了资源2
释放了资源1

推迟语句中的参数是立即求值的,推迟语句的调用会推迟到代码块结束时。这一点需要注意。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

一文快入VBA——一个VBA数据处理小程序的解析

这是我自己写的一个VBA处理的小程序,它极大地帮助我提高了数据处理的速度,现在我把它分享给你。个人觉得如果能够看看该程序,ExcelVBA使用的基本问题就不是比...

30170
来自专栏流浪猫的golang

go rune 简要分析

今天看golang代码看到一个单词 rune ,熟悉而陌生。之前学习go并没有过多注意这个“神秘符号”。 rune在golang中是int32的别名,在各个...

8810
来自专栏全沾开发(huā)

学习zepto.js(Hello World)

学习zepto.js(Hello World) Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery...

46080
来自专栏王磊的博客

vuejs深入浅出—基础篇

一、从HelloWorld说起 任何语言的都是从Hello World开始的,VueJs也不例外,直接上代码: <script src="https://unp...

33260
来自专栏Golang语言社区

Golang语言--一些基础用法

range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。其可以使用的对象包括string,array/slice,map,channel。其中stri...

34970
来自专栏Nian糕的私人厨房

JavaScript 基础

JavaScript 是一种轻量级,解释型的,有着函数优先 (First-class Function) 的编程语言,虽然它是作为开发 WEB 页面的脚本语言而...

12750
来自专栏Nian糕的私人厨房

ECMAScript6 数组去重

数组去重这个问题无论是在面试当中,还是实际项目中,出现的频率都挺多的,而我们以往的解决方式,就是通过新建一个空的数组,通过 indexOf 方法进行新数组和原数...

6730
来自专栏偏前端工程师的驿站

JS魔法堂:那些困扰你的DOM集合类型

一、前言                                     大家先看看下面的js,猜猜结果会怎样吧!   可选答案:   ①. 获取id属...

24690
来自专栏IMWeb前端团队

20个例子入门Q.js

本文希望通过20个简单的例子让没用过Q.js的同学快速掌握其基本用法 1. 新建实例 html代码: <div id="demo" q-text="msg"><...

31470
来自专栏Golang语言社区

Go 语言简介(上)— 语法

Hello World package main //声明本文件的package名 import "fmt" //import语言的fmt库——用于输出 f...

40680

扫码关注云+社区

领取腾讯云代金券