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循环,必须在循环中判断条件并退出循环
(2)for语句自己带有一个条件表达式
func main(){ a := 1 for a <= 3{ a++ fmt.Println(a) } fmt.Println("Over"); //输出2,3,4,over }
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") }