Go控制语句

指针

  • Go虽然保留了指针,但是与其他编程语言不通的是,在Go当中不支持指针运算以及“->”运算符,而是直接采用“.”选择符来操作指针目标对象的成员。
  • 操作符“&”取变量地址,使用“*”通过指针间接访问目标对象
  • 默认值是nil而非NULL
package main

import (
	"fmt"
)

func main() {
	a := 1
	var p *int = &a
	fmt.Println(p) //打印的是p所指向的内存地址
	fmt.Println(*p) //取出p指针指向地址的值,也就是a的值

}

递增递减语句

  • 在go当中,++与--是作为语句而并非作为表达式
package main

import (
	"fmt"
)

func main() {
	a := 1
	//a := a++ //表达式是可以直接放在等号右边的,而此时是不行的
	a++ //只能这样使用
	var p *int = &a
	fmt.Println(p)
	fmt.Println(*p)

}

判断语句if

  • 条件表达式没有括号
  • 支持一个初始化表达式(可以是并行方式)
  • 左大括号必须和条件语句或else在同一行
  • 支持单行模式
  • 初始化语句中的变量为block级别,同时隐藏外部同名变量
package main

import (
	"fmt"
)

func main() {
	a := 10
	if a := 1; a > 0 { //初始化语句中定义的变量它的作用域只在这个初始化语句块,超出这个语句块,这个变量就会变成没有定义的
		fmt.Println(a) //此时外部的a会被隐藏,输出内部语句a,也就是1
	}
	fmt.Println(a) //if语句执行完毕以后,会打印出外部的a,也集是10
}

循环语句for

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

import (
	"fmt"
)

func main() {
	a := 1
	for {
		a++
		if a > 3 {
			break
		}
		fmt.Println(a)
	}
	fmt.Println("over!")
}
//第二种形式,自己本身带条件的语句,也属于变异的while语句
package main

import (
	"fmt"
)

func main() {
	a := 1
	for a <= 3 {
		a++
		fmt.Println(a)
	}
	fmt.Println("over!")
}
//第三种形式,for循环常用形式
package main

import (
	"fmt"
)

func main() {
	a := 1
	for i := 0; i < 3; i++ {
		a++
		fmt.Println(a)
	}
	fmt.Println("over")

}

选择语句switch

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

import (
	"fmt"
)

func main() {
	a := 1
	switch a { //检查的变量条件是a本身
	case 0:
		fmt.Println("a=0")
	case 1:
		fmt.Println("a=1")
	default:
		fmt.Println("None")
	}

}
//第二种形式
package main

import (
	"fmt"
)

func main() {
	a := 1
	switch { //如果没有在switch后面跟条件表达式,就必须在case后面跟条件表达式
	case a >= 0:
		fmt.Println("a>=0")
		fallthrough //如果需要继续检查下一个case,就需要用到fallthrough
	case a >= 1:
		fmt.Println("a>=1")
	default:
		fmt.Println("None")
	}

}

//第三种形式
package main

import (
	"fmt"
)

func main() {

	switch a := 1; { //如果没有在switch后面跟条件表达式,就必须在case后面跟条件表达式
	case a >= 0:
		fmt.Println("a>=0")
		fallthrough //如果需要继续检查下一个case,就需要用到fallthrough
	case a >= 1:
		fmt.Println("a>=1")
	default:
		fmt.Println("None")
	}
	fmt.Println(a)//此时无法找到a
}
//不管是if、for、switch语句当中,进行初始化的变量,都是一个局部变量,作用域范围只在当前语句块

跳转语句goto,break,continue

  • 三个语法都可以配合标签使用
  • 标签名区分大小写,如果不使用也会造成编译错误
  • break和continue配合标签可用于多层循环的跳出
  • goto是调整执行位置,与其它两个语句配合标签的结果并不相同
package main

import (
	"fmt"
)

func main() {
LABEL1:
	for {
		for i := 0; i < 10; i++ {
			fmt.Println(i)
			if i > 3 {
				fmt.Println(i)
				break LABEL1 //这里使用标签的话,就可以一次性跳出循环
			}
		}
	}
	fmt.Println("OK")
}

package main

import (
	"fmt"
)

func main() {

	for {
		for i := 0; i < 10; i++ {
			fmt.Println(i)
			if i > 3 {
				fmt.Println(i)
				goto LABEL1 //这里如果使用goto语句的话,建议标签放在goto语句之后,如果放在goto语句之前的话,会造成死循环
			}
		}
	}
LABEL1:
	fmt.Println("OK")
}
package main

import (
	"fmt"
)

func main() {
LABEL1:
	for i := 0; i < 10; i++ {
		fmt.Println(i)
		if i > 3 {
			fmt.Println(i)
			continue LABEL1//跳过这次循环,continue下面的语句不会被执行
		}
	}

	fmt.Println("OK")
}

原文地址:https://www.cnblogs.com/skymyyang/p/7601435.html