Golang学习笔记2(程序结构篇)| 青训营

112 阅读4分钟

变量声明

var声明语句可以创建一个特定类型的变量,然后给变量附加名称,并且设置变量的初始值。变量声明的一般语法如下:

var 变量名字 类型 = 表达式

其中“类型”或“= 表达式”两个部分可以省略其中的一个。如果省略的是类型信息,那么将根据初始化表达式来推导变量的类型信息。如果初始化表达式被省略,那么将用零值初始化该变量

Go语言的零值初始化可以保证每个声明的变量总是一个合法值,利用这个特性我们可以简化很多代码(在C++中会出现未初始化变量值导致错误的情况)

也可以在一个声明语句中同时声明一组变量,或用一组初始化表达式声明并初始化一组变量。如果省略每个变量的类型,将可以声明多个类型不同的变量(类型由初始化表达式推导),一组变量也可以通过调用一个函数,由函数返回的多个返回值初始化:

var i, j, k int //三个均为int类型
var b, f, s = true, 1.14, "bravosix" // 三个类型分别为bool, float64, string
var f, err = os.Open(n) // os.Open返回两个值,分别用来初始化f,err

简短变量声明

相比于上面标准的声明形式,这种声明更加简洁灵活,它以名字 := 表达式形式声明变量,变量的类型根据表达式来自动推导.

和var形式声明一样,简短声明也可以声明并初始化一组变量。但是要注意的是,如果简短声明左边的变量在之前已经声明过,那么对这个变量只有赋值操作了

下面给出了一些示例:

i := 100 // 基本形式
i, j := 0, 1 // 声明一组变量
i, j = j, i // 交换 i 和 j 的值
//--------------------------------
in, err := os.Open(infile)
out, err := os.Create(outfile) // 可以用函数返回值声明或初始化变量

请注意!简短变量声明语句中必须至少要声明一个新的变量,下面的代码将不能编译通过:

f, err := os.Open(infile)
f, err := os.Create(outfile) // 没有声明新的变量

赋值

Go语言的赋值与C++类似,最简单的赋值语句是将要被赋值的变量放在=的左边,新值的表达式放在=的右边。Go语言支持自增++和自减--,同时支持元组赋值——它允许同时更新多个变量的值:

v := 1 
v++ // 等价方式 v = v + 1;v 变成 2 
v-- // 等价方式 v = v - 1;v 变成 1

流程控制

if else分支结构

功能与C++中的类似,但是需要注意的是关键字 if 和 else 之后的左大括号{必须和关键字在同一行,如果你使用了 else if 结构,则前段代码块的右大括号}必须和 else if 关键字在同一行,这两条规则都是被编译器强制规定的。

if condition1 {
    //...
} else if condition2 {
    //...
}else {
    //...
}

For循环结构

Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,关键字 for 的基本使用方法与C++非常接近

使用循环语句时,需要注意的有以下几点:

  • 左花括号{必须与 for 处于同一行
  • Go语言中的 for 循环与C语言一样,都允许在循环条件中定义和初始化变量,唯一的区别是,Go语言不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量。
  • Go语言的 for 循环同样支持 continue 和 break 来控制循环,但是它提供了一个更高级的 break,可以选择中断哪一个循环,如下例:
for j := 0; j < 5; j++ {
    for i := 0; i < 10; i++ {
        if i > 5 {
            break JLoop
        }
        fmt.Println(i)
    }
}
JLoop:
// ...

switch-case结构

Go语言改进了 switch 的语法设计,case 与 case 之间是独立的代码块,不需要通过 break 语句跳出当前 case 代码块以避免执行到下一行,case后不但可以添加常量,表达式也是允许的。

var r int = 11
switch {
case r > 10 && r < 20  //后跟表达式
fmt.Println(r)
}

在Go语言中 case 是一个独立的代码块,执行完毕后不会像C语言那样紧接着执行下一个 case,但是为了兼容一些移植代码,依然加入了 fallthrough 关键字来实现这一功能,代码如下:

var s = "hello"
switch {
case s == "hello":
    fmt.Println("hello")
    fallthrough
case s != "world":
    fmt.Println("world")
}

结果输出:

hello  
world

总结

Golang在变量声明、赋值时可以使用较为简短的语句创建、修改变量;而在for循环,if结构的方面和C++还是较为相似的,主要需要注意的就是程序格式的区别,本文介绍了Golang基础的一些程序结构,可以看出,Golang的语言还是较为简洁的,同时也借鉴了其他语言,有一些共通性。

下一篇预告:Golang中的数据类型