Go 语句和表达式

admin
admin 2020年03月04日
  • 在其它设备中阅读本文章

简单说来,一个 表达式 表示一个值,而一条 语句 表示一个操作,可以把表达式看作可以 返回值的语句 。但是在实际中,有些个表达式可能同时表示多个值,有些语句可能是由很多更基本的语句组成的。另外,根据场合不同,某些语句也可以被视为表达式。
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 // 通道接收操作