golang 试一下

一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。如果一个变量在函数体外声明,则被认为是全局变量,可以在整个包甚至外部包(被导出后)使用,不管你声明在哪个源文件里或在哪个源文件里调用该变量。

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。

句法块是由花括弧所包含的一系列语句,就像函数体或循环体花括弧包裹的内容一样。句法块内部声明的名字是无法被外部块访问的。这个块决定了内部声明的名字的作用域范围。

词法块是声明在代码中并未显式地使用花括号包裹起来。

对全局的源代码来说,存在一个整体的词法块,称为全局词法块;对于每个包;每个 for、if 和 switch 语句,也都对应词法块;每个 switch 或 select 的分支也有独立的语法块;当然也包括显式书写的词法块(花括弧包含的语句)。

声明语句对应的词法域决定了作用域范围的大小。对于内置的类型、函数和常量,比如 int、len 和 true 等是在全局作用域的,因此可以在整个程序中直接使用。

任何在函数外部(也就是包级语法域)声明的名字可以在同一个包的任何源文件中访问的。对于导入的包,例如 tempconv 导入的 fmt 包,则是对应源文件级的作用域,因此只能在当前的文件中访问导入的 fmt 包,当前包的其它源文件无法访问在当前源文件导入的包。还有许多声明语句,比如 tempconv.CToF 函数中的变量 c,则是局部作用域的,它只能在函数内部(甚至只能是局部的某些部分)访问。

控制流标号,就是 break、continue 或 goto 语句后面跟着的那种标号,则是函数级的作用域。

一个程序可能包含多个同名的声明,只要它们在不同的词法域就没有关系。

当编译器遇到一个名字引用时,如果它看起来像一个声明,它首先从最内层的词法域向全局的作用域查找。

在函数中词法域可以深度嵌套,因此内部的一个声明可能屏蔽外部的声明。还有许多语法块是 if 或 for 等控制流语句构造的。

 

posted on 2019-07-09 11:38  假_行_僧  阅读(140)  评论(0编辑  收藏  举报

导航