Go基础笔记

Go语言基础(一)

流程控制语句:for、if、else、switch、defer

for

Go只有一种循环结构: for 循环
基本的for循环由三部分组成,它们用分号隔开:

  • 初始化语句:在第一次迭代前执行
  • 条件表达式:在每次迭代前求值
  • 后置语句:在每次迭代的结尾执行

一个标准的for循环:

func main(){
    sum := 0
    for i:=0; i < 10; i++{
        sum += i
    }
    fmt.Println(sum)
}

初始化语句通常为一句短变量声明,该变量声明仅在for语句的作用域中可见。
一旦条件表达式的布尔值为false,循环迭代就会终止。
Go的for语句后面没有小括号,大括号{}是必须的

初始化语句和后置语句是可选的。

func main() {
    sum := 1
    for ; sum < 1000; {
        sum += sum
    }
    fmt.Println(sum)
}

for是Go中的while,此时可以去掉分号。

func main() {
    sum := 1
    for sum < 1000 {
        sum += sum
    }
    fmt.Println(sum)
}

无限循环

如果省略循环条件,该循环就不会结束,因此无限循环可以用以下写法

func main() {
    for {
    }
}

if

Go的if语句与for循环类似,表达式外无需小括号(),而大括号{}是必须的

func sqrt(x float64) string {
    if x < 0 {
        return sqrt(-x) + "i"
    }
    return fmt.Sprint(math.Sqrt(x))
}

if的简短语句

同for一样,if语句可以在条件表达式前执行一个简单的语句。
该语句声明的变量作用域仅在if之内
if之外使用报错,如下

image

if和else

在if的简短语句中声明的变量同样可以在任何对应的else块中使用。


image

switch

switch是编写一连串if-else语句的简便写法。它运行第一个值等于条件表达式的case语句。
Go的switch语句类似于C、C++、Java、Javascript和PHP中的,不过Go只运行选定的case,而非之后所有的case。实际上,Go自动提供了在这些语言中每个case后面所需的break语句。除非以fallthrough语句结束,否则分支会自动终止。Go的另一点重要的不同在于switch的case无需为常量,且取值不必为整数

func main() {
    fmt.Print("Go runs on ")
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        // freebsd, openbsd,
        // plan9, windows...
        fmt.Printf("%s.", os)
    }
}

switch的求值顺序

switch的case语句从上到下顺序执行,直到匹配成功时停止。

没有条件的switch

没有条件的switch同switch true一样。
这种形式能将一长串if-then-else写得更加清晰。

func main() {
    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("Good morning!")
    case t.Hour() < 17:
        fmt.Println("Good afternoon.")
    default:
        fmt.Println("Good evening.")
    }
}

defer

defer语句会将函数推迟到外层函数返回之后执行。
推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。

func main() {
    defer fmt.Println("world")

    fmt.Println("hello")
}

defer栈

推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。

func main() {
    fmt.Println("counting")

    for i := 0; i < 10; i++ {
        defer fmt.Println(i)
    }

    fmt.Println("done")
}

result:
counting
done
9
8
7
6
5
4
3
2
1
0
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,221评论 0 13
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,967评论 0 38
  • res and tool iterator for (vector ::iterator it = originS...
    scott_yu779阅读 271评论 0 0
  • 张宗林先生说“一日活动即课程。幼儿的一日活动是幼儿园工作的重心,是促进幼儿全面和谐发展的基本途径。为深入贯彻《指南...
    沈奇阅读 1,026评论 0 0
  • 这是写给你的第一封信 昨天晚上以及前天晚上和大前天晚上,我们都吵架了。我不知道好好的聊天打电话为什么最后会变成...
    屮亼阅读 394评论 0 4