Go语言笔记-表达式

表达式

指针

指针运算符为左值时,可以更新目标状态

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略过。