程序实体
Go语言中的程序实体包括变量、常量、函数、结构体和接口。
代码块
在Go语言中,代码块一般就是一个由花括号括起来的区域,里面开业包含表达式和语句。
Go语言本身以及我们编写的代码共同形成了一个非常大的代码块,即全域代码块。
相对小一些的代码块是代码包,一个代码包可以包含许多子代码包。
每个源码文件也是一个代码块,每个函数也是一个代码块,每个if语句、for语句、switch语句、select语句都是一个代码块,甚至switch语句中的case语句也是一个代码块。
只有两个花括号,里面没有内容也是一个代码块,即空代码块。
Go语言的代码块是一层套一层的,一个代码块可以有若干个子代码块,但对于每个代码块,最多只会有一个直接包含它的代码块,后者简称为前者的外层代码块。
作用域
代码块的划分间接的决定了其中的程序实体的作用域。
一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。
Go的作用域是通过代码块来标记的
一个程序实体的作用域总是会被限定在某个代码块中,而这个作用域最大的作用,就是对程序实体的访问权限的控制。
全局变量
如果一个变量在代码块外声明,则被认为是全局变量,可以在整个包甚至外部包(被导出后)使用,不管你声明在哪个源文件里或在哪个源文件里调用该变量。
局部变量
在代码块内声明的变量称之为局部变量,它们的作用域只在代码块内,函数的参数和返回值变量也是局部变量。
不同的作用域允许使用相同的变量名。同名的局部作用域的变量代码执行完后会释放变量名。
程序实体的访问权限规则
包级私有的、模块级私有的、公开的。
在语言层面依据代码块对程序实体的作用域进行的定义。
前两种访问权限对应的都是代码包代码块,最后一种访问权限对应的是全域代码块。
规则1
名称首字母为大写的程序实体才可以被其他代码包所使用。否则它就只能被当前包内其他代码使用。
首字母大写的程序实体相当于其他语言中声明为public修饰符的实体
其他情况相当于声明为private修饰符的实体
规则2
internal代码包中声明的公开程序实体只能被该代码包的直接父包及其父包的子包中的代码引用。引用前需要先导入此internal包。
对于其他代码包,导入该internal包都是非法的,无法通过编译。
网友评论