一个声明语句将程序中的实体和一个名字关闭,比如一个函数或一个变量。声明语句的作用域是指源代码中可以有效使用这个名字的范围。
不要将作用域和生命周期混为一谈。声明语句的作用域对应的是一个源代码的文本区域,它是一个编译时的属性。一个变量的生命周期是指程序运行时变量存在的有效时间段,在此时间区域内,它可以被程序的其它部分引用,是一个运行时的概念。
语法块是由花括号所包含的一系列语句。语法块内部声明的名字是无法被外部语法块访问的。语句块决定了内部声明的名字的作用域范围。有一个语法块为整个源代码,称为全局语法块;然后是每个包的包语法块;每个for、if和switch语句的语法块;每个switch或select的分支也有独立的语法块;当然也有显示书写的语法块(花括号包含的语句)。
声明语句对应的词法域决定了作用域范围的大小。对于内置的类型、函数和常量,例如int、len和true等都是全局作用域的;任何在函数外部声明的名字可以在包的任何源文件中访问,是包级作用域。对于导入的包,则是对应源文件级的作用域。控制流标号,就是break、continue或goto语句后跟着的那种标号,是函数级作用域。
当编译器遇到一个名字引用时,如果它是一个声明,首先从最内层的作用域向全局作用域查找。如果查找失败,则错误。如果名字在内部和外部分别声明过,则内部块的声明首先被找到,它会屏蔽外部同名的声明。
2.7 数据输入输出 2.7.1 标准输出函数Print( )函数采用默认格式将其参数格式化并写入标准输出。如果两个相邻的参数都不是字符串,会在它们的输出之间添加空格。返回写入的字节数和遇到的任何错误。函数原型如下:
func Print(a ...interface{}) (n , err )
Println( )与Print( )函数的功能基本一致,唯一不同的是在输出结束后,自动增加换行。函数原型如下:
func Println(a ...interface{}) (n , err )
Printf()函数根据format参数生成格式化的字符串并写入标准输出。返回写入的字节数和遇到的任何错误。函数原型如下:
func Printf(format , a ...interface{}) (n , err )
2.7.2 标准输入函数
Scan( )函数从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。函数原型如下:
func Scan(a ...interface{}) (n , err )
Scanln类似Scan,但会在换行时停止扫描。最后一个条目后必须有换行或者到达结束位置。函数原型如下:
func Scanln(a ...interface{}) (n , err )
Scanf从标准输入扫描文本,根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。函数原型如下:
func Scanf(format , a ...interface{}) (n , err )