关于变量名:
和Node.js一样,给变量起名需要保证第一个字符为字母或者下划线,后面可以跟任意数量的字符、数字和下划线,并且大小写敏感,Go也有它自己的关键字,这些关键字不能用作变量名,否则系统无法识别它是变量名还是有特殊的意义的,具体的关键字可以参考官方文档:https://golang.org/ref/spec#Keywords,在风格上,和Node.js推荐的风格一致,都是使用驼峰写法,也就是第一个单词都是小写,后面的单词第一个字母大写,其他字母小写,而不是采取很古老的蛇形写法,蛇形写法一般较多出现在较古老的系统当中。
关于声明
我们知道每个变量在使用之前,都需要在内存里面开辟一个空间,用于保存数据,这个过程就叫做声明,在Go里面做声明和Node.js不同,每个Go文件都以package声明开头,表明文件属于哪个包,package后面是import声明,然后是包级别的类型、变量、常量、函数的声明,不区分顺序。
在Go里面,变量的声明有两种,一种是var a = 100, 另外一种是短变量声明a := 100,第一种和Node.js相同,第二种是Go特有的一种方式。对于变量的声明,通用格式是var name type = expression, 类型和表达式可以省略其中一个,不能两个同时省略,另外如果声明的时候没有值,它会自动赋值,对于数字会赋0,对于boolean值会赋false,对于string会赋"", 这样在一定程度上可以避免undefined带来的问题,看来Go的发明者也是经历过很多undefined带来的坑。另外一个比较有意思的是,声明可以是一个变量列表,比如var a, b, c = 1, 2, 3,它相当于var a = 1; var b = 2; var c = 3; 然后我看别人给出的一个交换变量值的例子,Go的这个声明特性一下子就完成来变量值的交换工作:var a = 1; var b = 2; a, b = b, a; 直接a, b = b, a就完成了,我记得当年刚学编程的时候,变量交换是需要借助于第三个临时变量的,现在有了它,方便了许多。
谈到声明,必然会讲到作用域,变量分为包级别变量和局部变量,包级别变量可以理解为Node.js的全部变量,所以它的生命周期(或者叫作用域)为整个程序的执行时间,而局部变量的概念和Node.js相同,每次执行声明语句的时候在内存被创建,最后被当成垃圾被回收,作用域通常是一个函数的开始到结束。
有一种Go里面比较独特的变量类型,叫做指针,和C语言当中的指针类型类似,指针是一个变量的地址,一个指针指示值所保存的位置,使用指针可以在无须知道变量名字的情况下,间接读取或更新变量的值,如果一个变量声明为var x int,表达式&x (x的地址)获取一个指向整型变量的指针,它的类型是整型指针*int。如果值叫做p,我们说p指向x,或者p包含x的地址。p指向的变量写成*p,表达式*p获取变量的值,一个整型,因为*p代表一个变量,所以它可以出现在赋值操作符左边,用于更新变量的值。
有疑问加站长微信联系(非本文作者)