面试题答案
一键面试标识符命名规则
- 字符组成:
- Go语言的标识符由字母(包括Unicode字母)、数字和下划线组成。但标识符必须以字母或下划线开头。例如,
myVar
、_temp
、变量1
(在支持Unicode的环境下)都是合法的标识符,而1var
是不合法的,因为它以数字开头。
- Go语言的标识符由字母(包括Unicode字母)、数字和下划线组成。但标识符必须以字母或下划线开头。例如,
- 大小写敏感性:
- Go语言是大小写敏感的。这意味着
myVar
和MyVar
是两个不同的标识符。例如,在同一个作用域内,可以同时声明myVar
和MyVar
两个变量,它们代表不同的实体。
- Go语言是大小写敏感的。这意味着
- 作用域使用限制:
- 全局作用域:全局标识符在整个包内可见,不同包中如果要使用其他包的全局标识符,该标识符必须以大写字母开头(导出规则)。例如,在
package main
中定义一个全局变量var MyGlobalVar int
,在其他包中可以通过导入main
包来访问MyGlobalVar
(前提是导入的正确性)。如果定义为var myGlobalVar int
,则在其他包中无法直接访问。 - 局部作用域:局部标识符在其声明的块(如函数体、循环体等)内有效。在一个函数内部,不同块中可以声明同名的局部变量,但它们的作用域相互独立。例如:
- 全局作用域:全局标识符在整个包内可见,不同包中如果要使用其他包的全局标识符,该标识符必须以大写字母开头(导出规则)。例如,在
func main() {
var localVar int
{
var localVar int // 这个localVar和上面的localVar是不同的变量,因为在不同的块内
localVar = 10
}
localVar = 20
}
不符合规则导致的编译错误
- 以数字开头:
package main
func main() {
var 1var int // 编译错误:syntax error: unexpected number, expecting identifier
}
在这个例子中,由于标识符1var
以数字开头,Go编译器会报错,提示语法错误,意外的数字,期望是标识符。
2. 非法字符:
package main
func main() {
var my-var int // 编译错误:syntax error: unexpected -, expecting semicolon, newline, or }
}
这里my-var
中包含了非法字符-
,编译器会报错,指出意外的-
,期望是分号、换行符或}
。