虽然Go保留了指针,但与其他编程语言不同的是,Go不支持指针操作和“->相反,直接使用“运算符”.“选择符来操作指针目标对象的成员。 操作符“&“*”通过指针间接访问目标对象取变量地址 默认值是nil,而不是NULL
package mainimport ( "fmt")func main() { a := 1 var p *int = &a fmt.Println(p) ///打印P指向的内存地址 fmt.Println(*p) //取出p指针指向地址的值,也就是说,a的值}
递增减语句 在go中,++和–它被用作句子,而不是表达式
package mainimport ( "fmt")func main() { a := 1 //a := a++ //表达式可直接放在等号右侧,而且这个时候是不行的 a++ ///只能这样使用 var p *int = &a fmt.Println(p) fmt.Println(*p)}
判断句子if 条件表达式没有括号 支持初始表达式(可以并行) 左大括号必须与条件句或else相同 支持单行模式 初始化语句中的变量为block级别,同时隐藏外部同名变量
package mainimport ( "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一个循环语句关键词,但支持三种形式 初始化和步进表达可以是多个值 每个循环都会重新检查条件句,所以不建议在条件句中使用函数,尽量提前计算条件,用变量或常量代替 左大括号必须与句子在同一行
//第一种形式,类似while packagetrue的应用 mainimport ( "fmt")func main() { a := 1 for { a++ if a > 3 { break } fmt.Println(a) } fmt.Println("over!")}//第二种形式,自己有条件的句子,while语句package也属于变异 mainimport ( "fmt")func main() { a := 1 for a <= 3 { a++ fmt.Println(a) } fmt.Println("over!()}//第三种形式,packagegefor循环常用形式 mainimport ( "fmt")func main() { a := 1 for i := 0; i < 3; i++ { a++ fmt.Println(a) } fmt.Println("over")}
选择句子switchtch 可以使用任何类型或表达式作为条件句 不需要一些break,一旦条件符合自动终止条件 要想继续下一个case,需要使用fallthrough语句 支持初始表达式(可以并行),右侧需要跟随分号 左大括号必须与条件句在同一行
///以第一种形式package mainimport ( "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 mainimport ( "fmt")func main() { a := 1 switch { //如果switch后面没有条件表达式,case背后必须有条件表达式 case a >= 0: fmt.Println("a>=0") fallthrough //如果需要继续检查下一个case,需要使用falthrough case a >= 1: fmt.Println("a>=1") default: fmt.Println("None") }}//以第三种形式package mainimport ( "fmt")func main() { switch a := 1; { //如果switch后面没有条件表达式,case背后必须有条件表达式 case a >= 0: fmt.Println("a>=0") fallthrough //如果需要继续检查下一个case,需要使用falthrough 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 mainimport ( "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 mainimport ( "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 mainimport ( "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")}