Go语言学习(五)| 控制结构

153 阅读3分钟
原文链接: mp.weixin.qq.com

Go 对于值之间的比较有非常严格的限制,只有两个类型相同的值才可以进行比较,如果值的类型是接口,它们也必须都实现了相同的接口

for循环(没有do或者while)switch和ifselect 类型选择和多路通讯转接器

条件控制

if / else if

Go 的 if 还有个强大的地方就是条件判断语句里面允许声明一个变量,这个变量的作用域只能在该条件逻辑块内,其他地方就不起作用了,如下所示:

// 计算获取值x,然后根据x返回的大小,判断是否大于10。if x := computedValue(); x > 10 {    fmt.Println("x is greater than 10")} else {    fmt.Println("x is less than 10")}//这个地方如果这样调用就编译出错了,因为 x 是条件里面的变量fmt.Println(x)

使用 else if 时必须要注意中间的空格

switch

package mainfunc main() {    i := 1    switch i {    case 1:        println(1)        fallthrough    case 2:        println(2)    default:        println(0)    }}

注意

默认每个 case 后都带有 break ,匹配成功后不会自动向下执行其他 case 。fallthrough 关键字用来强制执行下一个 case 的值,如果 fallthrough 关键字后面显式的写 break 关键字会报错

例2:

package mainfunc main() {    i := 1    switch i {    case 1, 2:        println(i)    default:        println(0)    }}

goto

用 goto 跳转到一定是当前函数内定义的标签。标签名大小写敏感。

package mainimport "fmt"func main() {    demo()}func demo() {    i := 0Here:    fmt.Println(i)    i++    if i < 5 {        goto Here    }}

循环

循环语句是用来重复执行某一段代码。

for 循环

for的三种形式

//与 PHP 的 for 一样for init; condition; post {}
//和 while 一样for condition {}
//和 PHP 的 while(true) 一样(死循环)for {}

continue 语句用来跳出 for 循环中当前循环。在 continue 语句后的所有的 for 循环语句都不会在本次循环中执行。循环体会在一下次循环中继续执行。嵌套循环时,可以再 break 后面指定标签。用标签决定那个循环被终止。但是如果标签定义了就一定要使用

package mainfunc main() {J:    for j := 0; j < 5; j++ {        for i := 0; i < 10; i++ {            if i > 5 {                break J //直接退出最外层循环J            }            println(i)        }    }}

range 循环

range 可用于 slicearraystringmapchannel 。当对 slice 或者 array 做循环时, range 返回序号作为键,这个序号对应的内容作为值。

package mainimport "fmt"func main() {    str := "I love 中国"    for k, v := range str {        fmt.Printf("%d %s\n", k, v)    }}

例2:

package mainimport "fmt"func main() {    arr := [...]string{"a", "b", "c", "d"}    for _, val := range arr { //这个如果下面不想用到数组的序号,则要用 '_'        fmt.Printf("%s", val)    }    fmt.Printf("\n")}

也可以在字符串上直接使用 range 。

例:

package mainimport "fmt"func main() {    list := []string{"a", "b", "c", "d"}    for k, v := range list {        fmt.Printf("%d %s\n", k, v)    }    fmt.Println("-----------------")    list1 := "e例f"    for pos, char := range list1 {        fmt.Printf("%d %c\n", pos, char)    }}

注意输出结果:

0 a1 b2 c3 d-----------------0 e1 例      //注意:“例” 这个字占了3个字节,所以下面的序号变为了44 f