表达式
指针
指针运算符为左值时,可以更新目标状态
package main
func main(){
x:=10
var p *int = &x
println(&x,x)
println(p,*p)
*p += 20
println(p,*p)
println(&x,x)
}
output
0xc04202ff60 10
0xc04202ff60 10
0xc04202ff60 30
0xc04202ff60 30
并非所有对象都能进行取地址操作 指针类型不能做加减运算和类型转换
复合类型变量的初始化
一些语法限制 - 初始化表达式必须含类型标签 - 左花括号必须在类型尾部,不能另起一行 - 多个成员的初始值以逗号分开 - 允许多行,但每行必须以逗号或者右花括号结束
流控制
if…else…
条件表达式必须是布尔类型 ,可以省略括号
可以在条件表达式前加初始化语句,可定义块局部变量(作用域是该if
语句或执行 初始化函数。
switch
某条case
语句里有多个条件时,只要有一个命中即可匹配
如果有default
,在全部case
执行失败后才会执行default
语句。
不能重复出现常量case
条件。
相邻的空case
不构成多条件匹配,case
内容为空默认包含一个break
语句。
switch x {
case a:
case b:
println("b")
}
fallthrough
如需贯通后续的case
,需执行fallthrough。
当有fallthrough
时,不必匹配后续条件表达式。
func main() {
switch x:=5;x{
default:
println(x)
case 5:
x+=10
println(x)
fallthrough
case 10:
println(x)
}
}
output
15
15
fallthrough
必须放在case
结尾处,可以使用break
阻止执行。
for
go
语言只有一种循环,但是常见方法都能支持。
常见写法
for i=0;i<3;i++{ //初始化表达式支持函数调用或者定义局变量
}
for x<10{ //类似“while x<10{}”
}
for { //类似“while true{}”
break
}
可用for...rang
完成数据迭代,支持字符串、数组、数组指针、切片、字典、通道类型,返回索引、键值数据。
func main() {
data := [3]string{"a","b","c"}
for i,s := range data{
println(i,s)
}
}
允许单返回值,或者使用_
忽略。
func main() {
data := [3]string{"a","b","c"}
for i := range data{
println(i)
}
}
func main() {
data := [3]string{"a","b","c"}
for _,s := range data{
println(s)
}
}
但是range
也有个大坑,就是定义的局部变量会重复使用,即一个地址多次写值。
详见本博客博文《go语言坑之for range》。
如果range
的目标表达式是函数优化,也仅被执行一次。
func main() {
for i,s := range data(){
println(i,s)
}
}
func data() []int {
println("origin data.")
return []int{10,20,30}
}
output
origin data.
0 10
1 20
2 30
goto
continue
break
略过。