在编程语言中,词法是代码的构成法则。也就是说,词法规定了我们敲入怎样的字符才能编写出编译器 能够识别的代码,所以要掌握一门语言,那么语言的词法是我们要学习的第一步,Go语言也不过如此。
源代码表示
Go语言的代码是由若干Unicode字符组成,Unicode编码规范是一种在计算机上使用的字符编码 方式,它为世界上存在的各种语言的每个字符都设定了统一且唯一的二进制编码。因此,它能够满足跨语言、 跨平台的转换和文本处理需求,关于Unicode更详细说明,参见官网Unicode。 当前,你只需要记住一条规则:
Go语言的源代码是由Unicode编码规范的UTF-8格式进行编码的。
注释
-行注释:用两斜杠"//"开始到这一行结束 -块注释:从"/*"开始到"*/"结束
Go语言的词法元素包括4类:
标志符 (identifier)
关键字 (keyword)
运算符 (operator)和分隔符 (delimiter)
字面量 (literal)
一般情况下,空格符、制表符、回车符和换行符都会被忽略,除非它们作为多个语言符号之间的分隔符的一部分。 另外,Go语言会自动为代码插入分号以进行语句分隔,所以不在特殊情况下不需要显示的插入分号;
标志符
标志符就是对变量、常量、函数以及自定义类型进行命名。Go语言标志符的命名规范是由若干字母、下划线"_"和数字组成的字符序列,字符序列的第一个字符必须为字母,且首字母 标志符是区分大小写的。在使用标志符之前必须进行声明,一个声明就是将一个非空的标志符与常量、类型、变量、函数或代码包绑定在一起。在 同一个代码区块中,不允许重复声明同一个标志符,并且该标志符的作用域与所属代码区块的范围相同。
预定义标志符
Go语言中有一类特殊的标志符,被叫做预定义标志符。这类标志符是在Go语言的源代码中被声明的,具体声明如下:
基本数据类型名:int、float、string... 接口类型名:error 常量名:true,false和iota 内建函数名:append,cap,close,complex,copy,delete,imag,len,make,new,panic,print,println,real,recover
空标志符
Go语言有一个名为 "_" 的特殊标志符,叫(blank identifier)。通常作为忽略占位符使用,可以作表达式左值,但无法读取内容。 空标志符也常用来临时规避对未使用变量和导入包的错误检查,但需注意的是,它也属于预定义标志符。
限定标志符
在Go语言开发过程中,会经常访问其他代码包中的变量或类型,这时就需要用到限定标志符。 可以把代码包名称称作是限定标志符前缀,前缀和包中的标志符之间用英文的点(".")符号分隔。 要应用其它代码包中的标志符时,需要满足两个前提:
怎么才算是标志符可被导出的呢?
因为Go语言根据标志符名称中的第一个字母的大小写来确定该标志符的访问权限;具体规则是当标志符名称的第一个字符为小写时, 其访问权限就是"包级私有的",只有与该标志符在一个代码包的代码才能访问到它。 当标志符名称的第一个字符为大写时,其访问权限为"公开的",意味着该标志符可以被任何代码包的任何代码通过限定标志符访问。
用一个例子来总结上面的内容!
packagemain//main包名标志符import(//import导入其它代码包 "fmt"//fmt标准代码包名标志符 "strconv"//strconv标准代码包名标志符)funcmain(){//main函数名标志符 vaRSString="10010"//string预定义标志符 v,_:=strconv.Atoi(s)//v自定义标志符,_空白标志符 fmt.Printf("%T,%v",v,v)//fmt.Printf限定标志符}
注意:代码包标志符并不属于任何一个作用域,代码包声明只是为了区分若干源代码文件 是否属于同一个代码包。或者指定导入代码包时代表该代码包的引用名称。
命名建议:
尽量使用短命名,长名字并非你想象的那么更易读,多加文档和注释比格外长的名字更实用
混合大小写,且使用驼峰拼写格式,注意首字母的大小写愿意
保持package的名字和目录保持一致,尽量采取简短有意义的包名,不要和标准库名称冲突,包名应该为小写单词,不要使用下划线或者混合大小写
函数参数和返回值以小写字母开头
不要使用保留关键字作为标志符
不建议使用与预定义常量、类型、内置函数相同的名字作为标志符
专有名字通常全部大写
字面量
在计算机科学中,字面量是用于表达源代码中一个固定基本值的表示法(notation)。几乎所有计算机编程 语言都具有对基本值的字面量表示,比如:整数、浮点数、字符串、字符和布尔类型的数值都有对应的 字面量表示; 比如:数字15这个值是唯一的,但表示的方式有很多种:
二进制表达:1111 八进制表达:017 十进制表达:15 十六进制表达:0xF
对于开发者来说,当然知道要表达的意思,但是要把这种思想传达给编译器, 因为编译器对源代码做词法分析时会自动判决当前用户的输入属于哪一类字面量;
go语言的字面量与变量类型应关系:
字面量种类 | 变量的类型 | 举例 | @H_403_165@
---|---|---|
布尔 | bool | true/false | @H_403_165@
字符 | rune | 包含在单引号''之中的字符 | @H_403_165@
整型 | int | 15,017与0xF | @H_403_165@
浮点 | float64 | 0.,1.1,1.e+0.1E6,.25,.25e+5 | @H_403_165@
复数 | complex128 | |
字符串 | string | 包含在双引号 ""或反引号 ``之中 | @H_403_165@
举例说明一下:
packagemainimport("fmt" "reflect")funcmain(){ i:=0xf f:=.25 c:='c' s:=`go` cx:=011i fmt.Println(reflect.ValueOf(i),reflect.TypeOf(i)) fmt.Println(reflect.ValueOf(f),reflect.TypeOf(f)) fmt.Println(reflect.ValueOf(c),reflect.TypeOf(c)) fmt.Println(reflect.ValueOf(s),reflect.TypeOf(s)) fmt.Println(reflect.ValueOf(cx),reflect.TypeOf(cx)) } 输出:15int0.25float6499int32gostring(0+11i)complex128
字面量的通俗理解:编译器根据用户的输入,推论出输入的数据属于什么数据类型。
原文链接:https://www.f2er.com/go/189001.html