Go 语句和表达式
简单说来,一个 表达式 表示一个值,而一条 语句 表示一个操作,可以把表达式看作可以 返回值的语句 。但是在实际中,有些个表达式可能同时表示多个值,有些语句可能是由很多更基本的语句组成的。另外,根据场合不同,某些语句也可以被视为表达式。
Go 中大多数的表达式都是 单值表达式 。一个单值表达式只表示一个值。某些表达式可以表示多个值,它们被称为 多值表达式 。
如果一个函数或方法至少返回一个值,则它的调用属于表达式。特别的,如果返回两个或两个以上的值,则对它的调用称为多值表达式。不返回任何结果的函数或方法的调用不属于表达式。事实上,自定义函数(包括方法)本身都属于 函数类型 的值 ,所以它们都是单值表达式。
Go 代码包括许多的语句,其中一些语句被称为 简单语句 (simple statement),一共有六种,它由SimpleStmt 产生式定义:
SimpleStmt = EmptyStmt | ExpressionStmt | SendStmt | IncDecStmt | Assignment | ShortVarDecl
一、简单语句
1、空白语句(EmptyStmt)
显然,在简单语句中,空白语句就是什么都不做。
2、自增或自减语句(IncDec)
x++ // x += 1
x-- // x -= 1
在 Go 中,在表达式操作数后用 “--” 或 “++” 只能构成语句而不是表达式(即不能将其赋值给变量),注意 没有前缀版本,即在操作对象之前放置 “--” 或 “++”。
3、发送语句(SendStmt)
x <- 1
操作符“<-” 可以表示向 channel 变量发送值。它不返回任何值,因此不需要表达它。
4、表达式语句(ExpressionStmt)
f() // 函数调用
s.f() // 方法调用
<-c // 通道接收操作
包括有返回结果的函数或方法调用,以及通道的接收数据操作。某些表达式可以放入语句中。
5、赋值语句(Assignment)
var population int64
population = 8000000 // 赋值
var city, country string
city, country = "New York", "USA" //两个单值表达式赋值给两个变量
最基本的赋值形式:首先必须声明变量,右边的表达式必须可以赋值给一个变量:
当把一个以上的值分配给变量列表时,有两种形式。
- 第一种形式,一个表达式返回多个值,例如函数调用:
- 第二种形式是右侧包含有许多表达式, 但每一个是单值的:
6、简短变量声明语句(ShortVarDecl)
s := S{}
a := [...]int{1,2,3}
one, two := f(), g()
使用符号:= 可以实现简短的变量定义和初始化语法,简短变量声明语句也可以用来声明和初始化一组变量,需要注意的是,有以下限制:
- 定义变量,同时显式初始化
- 不能提供数据类型
- 只能用在函数内部
- 编译器会自动根据右值类型推断出左值的对应类型
二、非简单语句
一些非简单语句(其中一些语句包含有简单语句):
- 标准变量声明语句。是的,短声明语句属于简单语句,但是标准变量声明语句不属于
- (有名)常量声明语句
- 类型声明语句
- (代码)包引入语句
- 显式代码块。一个显式代码块起始于一个左大括号 {,终止于一个右大括号}。其中可以包含若干子语句
- 函数声明。一个函数声明中可以包含若干子语句
- 流程控制跳转语句
- 函数返回(return)语句
延迟函数调用和协程创建语句
// 一些非简单语句: import "time" var a = 123 const B = "Go" type Choice bool func f() int { for a < 10 { break } // 这是一个显式代码块。 { // ... } return 567 } // 一些简单语句的例子: c := make(chan bool) // 通道将在以后讲解 a = 789 a += 5 a = f() // 这是一个纯赋值语句 a++ a-- c <- true // 一个通道发送操作 z := <-c // 一个使用通道接收操作 // 做为源值的变量短声明语句 // 一些表达式的例子: 123 true B B + " language" a - 789 a > 0 // 一个类型不确定布尔值 f // 一个类型为“func ()”的表达式 // 下面这些即可以被视为简单语句,也可以被视为表达式。 f() // 函数调用 <-c // 通道接收操作