GO编程基础之三

1.指针:

   GO虽然保留了指针,但与其他编程语言不同的是,在GO当中不支持指针运算以及"->"运算符,而直接采用"."选择符来操作指针目标对象的成员

--操作符"&"取变量地址,使用"*"通过指针间接访问目标对象

--默认值为nil而非NULL

func main(){
    a := 1                //int型变量a
    var P *int = &a       //指向int的指针P
    fmt.Println(P);       //输出P所指向的内存地址
fmt.Println(P*); //输出P指针指向地址的值 }

 

2.递增递减语句:

     在GO当中,++与--是作为语句并不是作为表达式;

     表达式是可以放在等号右边的;比如:a := a++   这样在GO语句是不被允许的;

      语句只能作为单独的一行;

func main(){
    a := 1
    a++
    var P *int = &a
    fmt.Println(*P);
}

 

3.判断语句IF:

---条件表达式没有括号;

---支持一个初始化表达式(可以是并行方式);

func main(){
a := 1
if a :=1;a > 1{ //初始化变量a是一个局部变量,等if语句块全部执行完后变量a就不存在了 fmt.Println(a); } fmt.Println(a); //如果外部也定义一个变量a,这个时候外部的变量a在if语句块中就会被暂时隐藏起来,整个if语句中都只会用初始化的变量a }

---左大括号必须和if语句或else放在同一行;

---支持单行模式

---初始化语句中的变量为block级别,同事隐藏外部同名变量

 

4.循环语句for

---Go只有for一个循环语句关键字,但支持3中形式;

(1)无限循环:只有一个for循环,必须在循环中判断条件并退出循环

func main(){
    a := 1
    for {
        a++
        if a>3 {
            break
        }
        fmt.Println(a)   //输出2,3,over
    }

    fmt.Println("Over");
}

(2)for语句自己带有一个条件表达式

func main(){
    a := 1
    for a <= 3{
        a++
        fmt.Println(a)
    }

    fmt.Println("Over");    //输出2,3,4,over
}
(3)for循环包含:计数器的初始化,条件判断语句和步进表达式
func main(){
    a := 1
    for i :=0;i < 3;i++{
        a++
        fmt.Println(a)
    }

    fmt.Println("Over");
}

 

---初始化和步进表达式可以是多个值;

---条件语句每次循环都会被重新检查,因此不建议在条件语句中使用函数,尽量提前计算好条件并以变量或常量代替

func main(){
    a := "string"
l := len(a)
for i :=0;i < len(a);i++{ //for循环每次都会执行len函数,降低了程序运行效率不如把len函数放在for循环之外 fmt.Println(a) } fmt.Println("Over"); }

 

---左大括号必须和条件语句在同一行

 

 

5.选择语句switch:

---可以使用任何类型或表达作为条件语句;

---不需要写break,一旦条件符合自动终止;

---如希望继续执行下一个case,需要使用fallthrough语句;

---支持一个初始化表达式(可以是并行方式),右侧需跟分号

---左大括号必须和条件语句在同一行;

 (1)一般形式,switch后加条件表达式:

func main(){
    a := 1
    switch a {
    case 0:
        fmt.Println("a=0")
    case 1:
        fmt.Println("a=1")
    default:
        fmt.Println("None")

    } 
}

(2)case后加条件表达式:

func main(){
    a := 1
    switch {
    case a >= 0:              //满足条件就跳出了,不继续下一个case
        fmt.Println("a>=0")   
fallthrought //即使第一个case符合条件,还是会继续检查下一个case
case a >= 1: fmt.Println("a>=1") default: fmt.Println("None") } }

(3)switch后加初始化语句:初始化变量a的作用域范围在switch语句块中,是局部变量;

func main(){
    
    switch a := 1; {
    case a >= 0:
        fmt.Println("a=0")
    case a >= 1:
        fmt.Println("a=1")
    default:
        fmt.Println("None")

    } 
    fmt.Println(a)
}

 

6.跳转语句:goto,break,continue

---三个语法都可以配合标签使用;

---标签名区分大小写,若不使用会造成编译错误;

---Break与continue配合标签可用于多层循环的跳出;

---Goto是调整执行位置,与其他2语句配合标签的结果并不相同;

(1)原来的break只能跳出一层循环:只能跳出第一个for有限循环,但是跳不出最上层的for无限循环;

func main(){
LABEL1:
    for{
        for i := 0;i < 10;i++{
            if i > 3{
                break
            }
        }
    }
}

(2)使用标签后,break可以跳出到和LABEL1同一级的循环层:

func main(){
LABEL1:
    for{
        for i := 0;i < 10;i++{
            if i > 3{
                break LABEL1      //如果将这里的break改成goto,程序就会又跳到LABEL1继续执行,容易造成死循环
            }
        }
    }
fmt.Println("OK") }

(3)使用goto,尽量把goto放到,标签之前;

func main(){
    for{
        for i := 0;i < 10;i++{
            if i > 3{
                goto LABEL1
            }
        }
    }
LABEL1:    
    fmt.Println("OK")
}

(4)continue:

func main(){
LABEL1:
    for i := 0;i < 10; i++{
        for{
            continue LABEL1
            fmt.Println(i)       //内部的无限循环语句永远不会被执行,因为continue直接跳到外部的有限循环语句执行了
        }        
    }    
    fmt.Println("OK")
}

 

posted @ 2018-11-18 15:49  小春熙子  阅读(178)  评论(0编辑  收藏  举报