译:go’s block and identifiers scope

go 代码块和标识符作用域

(go’s  block and identifiersscope)

一、      Blocks

block is a possibly empty sequence of declarations andstatements
within matching brace brackets.

语句块(blocks)由闭合的大括号包裹,里面可能包含空的声明或者语句;block与作用域密切相关,见下章节。

Block = "{" StatementList "}" .

StatementList = { Statement ";" }.

In addition to explicit blocks in the source code, thereare implicit blocks:

在go源码中除了显示的block (特指有{}包裹的代码块),还有隐式block.

1.    The universe block encompasses
all Go source text.

go 语言全局block,
在整个语言层面

2.    Each package has
package block containing all Go source text forthat package.

每一个package有自己的block,
包裹包中的源码

3.    Each file has a file block containing
all Go source text inthat file.

每个文件有自己的block,
该block的作用更多的是import package使用

4.    Each "if""for",
and "switch" statement is considered
to be inits own implicit block.

if , for , switch 语句有其内部的block

5.    Each clause in a "switch" or "select" statement
acts as an implicitblock.

switch, select 的每个case
子句有其隐含的block

Blocks nest and influence scoping.

二、      Declarations and scope
声明和作用域

declaration binds a non-blank identifier
to a constanttypevariablefunctionlabel,
or package. Everyidentifier in a program must be declared. No identifier
may be declared twicein the same block, and no identifier may be declared in both the file andpackage block.

一个声明绑定一个非空标识符,用来表示:常量,类型,变量,函数,标签,包。每一个标识符在使用前必须进行声明。再相同的block中,标识符不能被重复声明;标识符不允许在package block和file
block中声明(注意在每个.go文件中,声明的indentifier默认的作用域就是整个package,
file 的block仅仅被用来在import package中使用,所以上句话的意识就是,同一个文件block中identifier不能声明两次,同一个包中identifier
不能声明两次,如果file
在该package中,则iderntifier在该package的所有.go文件中只能出现一次)

The blank identifier may
be used like any otheridentifier in a declaration, but it does not introduce a binding and thus isnot declared.

空白标识符仅仅用来占位,不进行变量绑定,就像没有声明一样,就是个语法糖。

Declaration   = ConstDecl |
TypeDecl |
VarDecl .

TopLevelDecl  = Declaration |
FunctionDecl |
MethodDecl .

The scope of a declared identifier is the extent of source text
inwhich the identifier denotes the specified constant, type, variable, function,label, or package.

标识符的作用域是指标示符代替特定constant,type, variable, function, label, or package在代码域中的可见范围。

Go is lexically scoped using blocks:
go 使用的是block来控制作用域(scope).

1.    The scope of a predeclared
identifier
 is the universe block.

预声明的标识符是全局可见

2.    The scope of an identifier denoting a constant, type,variable, or function (but not method) declared at top level (outside anyfunction) is the package block.

在函数外声明的constant,type, variable, or function (but not method)在包范围内可见

3.    The scope of the package name of an imported package isthe file block of the file containing the import declaration.

import packagename  的作用域是该import packagename的文件

4.    The scope of an identifier denoting a method receiver,function parameter, or result variable is the function body.

指代method receiver,function parameter, or result variable的标识符作用域在整个函数内部;

5.    The scope of a constant or variable identifier declaredinside a function begins at the end of the ConstSpec or VarSpec (ShortVarDeclfor short variable declarations)
and ends at the end of the innermostcontaining block.

在函数内部声明的指代onstant orvariable
的标识符的作用域:开始于生命处,结束与其所属的最内部的block

6.    The scope of a type identifier declared inside a function begins at theidentifier in the TypeSpec and ends at the end of the innermost containingblock.

函数内部的type类型标识符作用域:开始于生命处,结束于其所属的最内部block结尾。

An identifier declared in a block may be redeclared in aninner block. While the identifier of the inner declaration is in scope, itdenotes the entity declared by the inner declaration.

在block内声明的标识符,可以在block内部的block内重新声明,重新声明的标识符仅在inner
block可见。

The package clause is
not a declaration; the packagename does not appear in any scope.

Its purpose is to identify the files belonging to thesame package and
to specify the defaultpackage name for import declarations.

包定义语句:package packagename不是一个声明,包名不属于任何作用域,它的目的是标志一个文件属于某个包,制定报名是为了便于import
进行引入。

1.   Label scopes 
标签作用域

Labels are declared by labeled statements and
are used in the "break""continue",
and "goto" statements. It is illegal
todefine a label that is never used. In contrast to other identifiers, labels arenot block scoped and do not conflict with identifiers that are not labels. Thescope of a label is the body of the function in which it is declared andexcludes the body of any
nested function.

label名在标签语句中进行进行声明,在break, continue, goto 语句中使用。定义一个标签而不是用会产生语法错误。为了和其他标识符进行区分,label不适用与block 作用域,不会与其他的非label标识符产生冲突,label作用域在其声明的函数内,函数内部的匿名函数对其不可见。

注意:

go中的声明包括定义的含义,声明一个type就是在定义一个类型,声明一个变量就会为其分配存储空间;在go中统一称为declare , not define.

译:go’s block and identifiers scope

时间: 2024-10-24 20:56:40

译:go’s block and identifiers scope的相关文章

(译)IOS block编程指南 2 block开始

Getting Started with Blocks(开始block) The following sections help you to get started with blocks using practical examples. 接下来这一节有实用的例子帮你开始blocks. Declaring and Using a Block (定义和使用block) You use the ^ operator to declare a block variable and to indic

(译)IOS block编程指南 1 介绍

Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to standard C functions, but in addition to executable code they may also contain variable bindings to automatic (stack) or managed (heap) memory. A block ca

golang label breaks

我们在for多层嵌套时,有时候需要直接跳出所有嵌套循环, 这时候就可以用到go的label breaks特征了. 先看一个范例代码: package main import (     "fmt" ) func main() {     fmt.Println("1") Exit:     for i := 0; i < 9; i++ {         for j := 0; j < 9; j++ {             if i+j > 1

Block 转:

Block简介: Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). 例如下面的一个例子: [cpp] view pla

iOS block的一些理解

Block实体形式如下:^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). ps:一个block虽然和函数指针有些相似,但是实际上代表一个底层数据结构,类似与对象,有编译器去创建和管理.block的一个优势是可以使用其自己作用域外的变量,

ObjectiveC中的block用法解析

Block Apple 在C, Objective-C,C++加上Block这个延申用法.目前只有Mac 10.6 和iOS 4有支持.Block是由一堆可执行的程序组成,也可以称做没有名字的Function(Anonymous function).如果是Mac 10.6 或 iOS 4.0 之前的平台可以利用 http://code.google.com/p/plblocks/这个project得以支持Block语法.Apple有一个叫做GCD(Grand Central Dispach)的新

iOS Block 用法 (1)-once again

Block简介: Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). 例如下面的一个例子: [cpp] view pla

IOS中 Block简介与用法(一)

?Block简介: Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是"^",接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). 例如下面的一个例子: [cpp] vi

IOS中的Block与C++11中的lambda

ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简介过,现在说下ios中的block Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),ret