黄宽的blog

宁可十年不将军,不可一日不拱卒



控制语句与数组

基本控制语句有if,for,switch。if系列语句和php的一些区别,if条件判断语句不能写小括号,并且在条件判断前可以有初始化操作语句,只能有一个初始化语句,if下的执行语句由花括号包起来,左花括号必须与if同行。如下

    if a, b := 3, 4; a == 3 {
        fmt.Println(a)
        fmt.Println(b)
    }

上面代码块变量a和b只在当前if执行语句内有效,如果在if块外也有a和b两个变量则外部同名变量在if代码块内被隐藏,要申明多个变量只能放在同一个语句里面,不能以a:=3;a:=4;这种不行。

循环语句在go里面只有for循环,for循环有三种表现方式,for{}这一种是无限循环,for a>3{}这一种可以加一个条件判断,不要去尝试执行语句内不写步长。还有一种for循环跟php一样,for a:=1;a<3;a++{}。

三个跳转语句,break,continue,goto

Lable:
    for {
        for a := 1; a < 10; a++ {
            if a == 5 {
                break Lable
            } else {
                fmt.Println(a)
            }
        }
    }

Lable为外层for的标签,这个for是一个无限循环的for,到了第二层如果a如果等于5了,则会结束到Lable对应的for。如果把这个break改为continue的话,这就是无限循环了,continue只是结束这一层循环继续下一层循环,改成goto的话会重新开始这个for循环,当然也是一个死循环了。

switch判断不需要手动break,符合case条件后会执行完语句就停止。如果需要继续往下走需要手动加上fallthrough语句。switch也可以写一个初始化语句。

    switch a := 2; {
    case a == 2:
        fmt.Println(2)
    }
func main() {
    x, y := 1, 2
    a := [2]*int{&x, &y} //保存的是指针,&取址
    c := [...]int{1: 0}  //...可以代替未知单元个数,会自动算出个数
    var d *[2]int = &c   //保存的是数组实际的值,指向数组的指针,用关键字new出来的也是指向数组的指针
    var b = new([2]int)
    fmt.Println(a)
    fmt.Println(*a[1]) //*号取值
    fmt.Println(b)
    fmt.Println(d)
    var s [2][3][3]int
    fmt.Println(s)
}
//数组
//1.声明 var a [单元个数]类型,声明并赋值 a:=[单元格数]类型{索引:值},使用var就只能声明不能赋值,使用:=方式就必须得赋值,哪怕是放个空的花括号。
//2.数组可以进行等于或不等于的比较,数组的长度是作为一种类型存在的,不同类型的数组不能进行比较
//3.使用new声明的数组保存的是指向数组的本身,c := [...]int{1: 1},var d *[2]int = &c,d保存的也是指向数组的本身,
//4.c保存的则是数组本身,打印出来c和d可以看到d前面有个&符号。
//5.多维数组申明,可以这么理解s里面有两个一维数组,每个一维数组里面有三个数组,属于二维数组,最后一个代表多少个键值对


  golang

作者  :  黄宽

不耻最后,即使慢,驰而不息,纵会落后,纵令失败



About ME

about me

黄宽

我不想成为一个庸俗的人。十年百年后,当我们死去,质疑我们的人同样死去,后人看到的是裹足不前、原地打转的你,还是一直奔跑、走到远方的我?

友情链接