go基础编程day3控制语句与数组array

控制语句

判断语句if

  • 条件表达式没有括号
  • 支持在条件语句汇总初始化表达式(可以是并行方式)(初始化的值只作用于if-else这个语句块,即使与语句块外面的变量重名也互不干扰)
  • 可以写在一行内,但是格式化时一样回变成标准格式
  • 左大括号必须和条件语句处于同一行
package main

import (
    "fmt"
)

func main() {
    a := 9

    if a > 10 {
        fmt.Println("a>10")
    } else if a < 10 {
        fmt.Println("a<10")
    } else {
        fmt.Println("a = 10")
    }
}

for语句

  • go只有一个循环语句关键词,但支持3种形式
  • 初始化和步进表达式可以事多个值
  • 条件语句每次循环都会被重新检查,因此不建议在条件语句中使用函数,尽量提前计算好条件并以变量或常量代替
  • 左大括号必须和条件语句在同一行

第一种

package main

import (
    "fmt"
)

func main() {
    a := 1
    // 第一种,直接循环
    for {
        a++
        if a > 3 {
            break
        }
        fmt.Println(a)
    }
    fmt.Println("over")

}

第二种

package main

import (
    "fmt"
)

func main() {
    a := 1
    // 第二种,for加判断,类似while
    for a <= 3 {
        a++
        fmt.Println(a)
    }
    fmt.Println("over")
}
/*
2
3
4
over
*/

第三种

package main

import (
    "fmt"
)

func main() {
    a := 1
    // 第三种,for加赋值判断
    for i := 0; i < 3; i++ {
        a++
        fmt.Println(a)
    }
    fmt.Println("over")
}

/*
2
3
4
over
*/

选择语句switch

  • 可以使用任何类型或表达式作为条件语句
  • 不需要写break,一旦条件符合自动终止
  • 如果希望继续执行下一个case,需要使用fallthrough语句
  • 支持一个初始化表达式(可以是并行方式),右侧需要跟分号
  • 左大括号必须和条件语句在同一行
package main

import (
    "fmt"
)
// 选择语句switch
func main() {
    a := 1
    switch a {
    case 0:
        fmt.Println("a=0")
    case 1:
        fmt.Println("a=1")
    }
    fmt.Println(a)
}
package main

import (
    "fmt"
)

// 选择语句switch
func main() {
    a := 1
    // 这里case条件语句的时候switch后面不需要再加变量名
    switch {
    case a >= 0:
        fmt.Println("a>=0")
        fallthrough
    case a >= 1:
        fmt.Println("a>=1")
    }
    fmt.Println(a)
}
package main

import (
    "fmt"
)

// 选择语句switch
func main() {
    // 再switch后跟随声明定义
    switch a := 1; {
    case a >= 0:
        fmt.Println("a>=0")
        fallthrough
    case a >= 1:
        fmt.Println("a>=1")
        fallthrough
    default:
        fmt.Println("none")
    }
}

goto,break,continue跳转语句

  • 三个语法都可以配合标签使用
  • 标签名区分大小写,若不使用会造成编译错误
  • break与continue配合标签可用于多层循环的跳出
  • goto是调整执行位置,与其他两个语句配合标签的结果并不相同
/* break */
func main() {
    // 定义标签
LABEL1:
    // 无限循环
    for {
        for i := 0; i < 10; i++ {
            if i > 3 {
                // 指定跳出哪一层
                break LABEL1
            }
        }
    }
    fmt.Println("OK")
}  // OK 跳出了无限循环
/* 标签放在goto之后,利用goto跳出死循环 */
func main() {

    // 无限循环
    for {
        for i := 0; i < 10; i++ {
            if i > 3 {
                // 指定跳到哪里
                goto LABEL1
            }
        }
    }
    // 定义标签
LABEL1:
    fmt.Println("OK")
}  // OK

continue不带标签的时候为跳过生下的循环体,直接进入下次循环

package main

import (
    "fmt"
)

func main() {
    // 定义标签
LABEL1:
    for i := 0; i < 10; i++ {
        fmt.Println(i)
        // 无限循环
        for {
            // 继续标签所在 循环
            continue LABEL1
        }
    }
    fmt.Println("OK")
}

数组array

  • 定义数组:var [], n>=0
  • 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
  • 注意区分指向数组的指针和指针数组
  • 数组在go中为值类型(切片为引用类型)
  • 数组之间可以使用==或!=进行比较,但不能使用>或<
  • 可以使用new来创建数组,此方法返回一个指向数组的指针
  • go支持多维数组
  • 长度相同数组才是类型相同,长度不同就是不同的类型,不能直接赋值
  • 数组声明之后也是存在零值的
/* 声明数组的几种方式 */
func main() {
    // var  [n] 注意n>=0
    var a [2]int
    var b [2]int
    // 只有长度相同才可以直接赋值
    a = b
    // 另一种方式,大括号内跟准确的值
    c := [2]int{1, 1}
    //
    d := [2]int{1}
    // 索引赋值
    e := [20]int{19: 1}
    // 省略数组大小n
    f := [...]int{1, 2, 3, 4, 5, 6}
    g := [...]int{19: 1}

    fmt.Println(a) // [0 0]
    fmt.Println(b) // [0 0]
    fmt.Println(c) // [1 1]
    fmt.Println(d) // [1 0]
    fmt.Println(e) // [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
    fmt.Println(f) // [1 2 3 4 5 6]
    fmt.Println(g) // [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
}

使用new关键词来创建数组返回一个指向数组的指针

package main

import (
    "fmt"
)

func main() {
    p := new([10]int)
    fmt.Println(p) // &[0 0 0 0 0 0 0 0 0 0]
}

数组本身和指向数组的指针都可以直接通过索引修改数组

package main

import (
    "fmt"
)

func main() {

    a := [10]int{}
    a[1] = 2
    p := new([10]int)
    p[1] = 2
    fmt.Println(a) // [0 2 0 0 0 0 0 0 0 0]
    fmt.Println(p) // &[0 2 0 0 0 0 0 0 0 0]
}

多维数组

package main

import (
    "fmt"
)

func main() {
        // 这里同样可以支持索引赋值,最外层可以使用三个.来代替
    a := [2][3]int{
        {1, 2, 3},
        {4, 5, 6},
    }
    fmt.Println(a) // [[1 2 3] [4 5 6]]
}

go语言版本的冒泡排序:

package main

import (
    "fmt"
)

// go语言版本冒泡排序
func main() {
    a := [...]int{4, 8, 2, 7, 1, 9, 5, 6}
    // 打印排序前
    fmt.Println(a)
    // 获取长度,提前赋值如果放在循环中每次都要执行
    nums := len(a)
    for i := 0; i < nums; i++ {
        for j := i + 1; j < nums; j++ {
            // 从大到小
            if a[i] < a[j] {
                temp := a[i]
                a[i] = a[j]
                a[j] = temp
            }
        }
    }
    fmt.Println(a)
}
// [4 8 2 7 1 9 5 6]
// [9 8 7 6 5 4 2 1]

你可能感兴趣的:(go基础编程day3控制语句与数组array)