package main
/*
指针
Go虽然保留了指针,但与其它编程语言不同的是,在Go当中不
支持指针运算以及”->”运算符,而直接采用”.”选择符来操作指针
目标对象的成员
操作符”&”取变量地址,使用”*”通过指针间接访问目标对象
默认值为 nil 而非 NULL
递增递减语句
在Go当中,++ 与 -- 是作为语句而并不是作为表达式
*/
import (
"fmt"
)
func main() {
a := 1
var p *int = &a
fmt.Println(p) //0xc0420120b8
fmt.Println(*p) //1
b := a++ //++只能是语句,不能是表达式, unexpected ++ at end of statement
fmt.Println(b) //1
/*
条件表达式没有括号
支持一个初始化表达式(可以是并行方式)
左大括号必须和条件语句或else在同一行
支持单行模式
初始化语句中的变量为block级别,同时隐藏外部同名变量
1.0.3版本中的编译器BUG
*/
a1 := 10
if a1 := 1; a1 < 2 { //a在if和else里面的局部变量,覆盖外部在a,if走完后用全局的a
fmt.Println(a1)
} else {
fmt.Println(a1)
}
fmt.Println(a1)
if a, b, c = 1, 2, 3; a+b+c > 6 {
} else {
}
for {
a++
if a > 3 {
break
}
}
for a < 3 {
a++
}
for i := 0; i < 3; i++ {
a++
}
/*
选择语句switch
可以使用任何类型或表达式作为条件语句
不需要写break,一旦条件符合自动终止
如希望继续执行下一个case,需使用fallthrough语句
支持一个初始化表达式(可以是并行方式),右侧需跟分号
左大括号必须和条件语句在同一行
*/
a := 1
switch a { //switch a := 1;{ a是局部变量
case 0:
fmt.Println("0") //不用写break
case 1:
fmt.Println("1")
case a >= 1:
fmt.Println("1")
fallthrough //继续执行下一个case
default:
fmt.Println("default")
}
/*
跳转语句goto, break, continue
三个语法都可以配合标签使用
标签名区分大小写,若不使用会造成编译错误
Break与continue配合标签可用于多层循环的跳出
Goto是调整执行位置,与其它2个语句配合标签的结果并不相同
*/
LABEL1:
for {
for i := 0; i < 10; i++ {
if i > 3 {
break LABEL1 //不使用LABEL则break只是跳出上一层的for循环,
//使用break + 标签则跳出与标签同级的for循环(使用标签可以指定跳出哪成for循环),
//这里是最外层的for循环//与标签平级的for循环不再执行,
//如果改成goto LABEL1则又会去从LABEL1开始执行,应该goto到最外层for循环结束处
} else {
fmt.Println(i)
}
}
}
LABEL2:
for {
for i := 0; i < 10; i++ {
if i > 3 {
continue //结束本次循环
continue LABEL2 //continue + 标签:跳到与标签平级的for循环的下一次循环,而不是
//本层循环(指定跳到哪个for循环的下一层)
} else {
fmt.Println(i)
}
}
}
}