golang 基本词法

100018 · · 1111 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在编程语言中,词法是代码的构成法则。也就是说,词法规定了我们敲入怎样的字符才能编写出编译器 能够识别的代码,所以要掌握一门语言,那么语言的词法是我们要学习的第一步,Go语言也不过如此。

  • 源代码表示

Go语言的代码是由若干Unicode字符组成,Unicode编码规范是一种在计算机上使用的字符编码 方式,它为世界上存在的各种语言的每个字符都设定了统一且唯一的二进制编码。因此,它能够满足跨语言、 跨平台的转换和文本处理需求,关于Unicode更详细说明,参见官网聽Unicode。 当前,你只需要记住一条规则:

Go语言的源代码是由Unicode编码规范的UTF-8格式进行编码的。
  • 注释

-聽行注释:聽用两斜杠"//"开始到这一行结束
-聽块注释:聽从"/*"聽开始到聽"*/"结束

Go语言的词法元素包括4类:

  1. 标志符 (identifier)

  2. 关键字 (keyword)

  3. 运算符 (operator)和分隔符 (delimiter)

  4. 字面量 (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语言开发过程中,会经常访问其他代码包中的变量或类型,这时就需要用到限定标志符。 可以把代码包名称称作是限定标志符前缀,前缀和包中的标志符之间用英文的点(".")符号分隔。 要应用其它代码包中的标志符时,需要满足两个前提:

  1. 代码包必须被提前导入到该代码文件中

  2. 该标志符在代码包必须是可被导出的

怎么才算是标志符可被导出的呢?

  1. 标志符名称中的第一个字符必须大写

  2. 标志符必须是被声明在一个代码包中的变量、类型、结构体类型的字段名、函数或方法名称等。

因为Go语言根据标志符名称中的第一个字母的大小写来确定该标志符的访问权限;具体规则是当标志符名称的第一个字符为小写时, 其访问权限就是"包级私有的",只有与该标志符在一个代码包的代码才能访问到它。 当标志符名称的第一个字符为大写时,其访问权限为"公开的", 意味着该标志符可以被任何代码包的任何代码通过限定标志符访问。

用一个例子来总结上面的内容!

package聽main聽聽聽聽//main聽包名标志符import聽(聽聽聽聽聽聽聽聽//import聽导入其它代码包
聽聽聽聽"fmt"聽聽聽聽聽聽聽//fmt聽标准代码包名标志符
聽聽聽聽"strconv"聽聽聽//聽strconv聽标准代码包名标志符)func聽main()聽{聽聽聽//main聽函数名标志符
聽聽聽聽var聽s聽string聽=聽"10010"聽聽聽聽//string聽预定义标志符
聽聽聽聽v,聽_聽:=聽strconv.Atoi(s)聽//v自定义标志符,_空白标志符
聽聽聽聽fmt.Printf("%T,聽%v",聽v,聽v)聽//fmt.Printf聽限定标志符}
注意:聽代码包标志符并不属于任何一个作用域,代码包声明只是为了区分若干源代码文件
是否属于同一个代码包。或者指定导入代码包时代表该代码包的引用名称。

命名建议:

  1. 尽量使用短命名,长名字并非你想象的那么更易读,多加文档和注释比格外长的名字更实用

  2. 混合大小写,且使用驼峰拼写格式,注意首字母的大小写愿意

  3. 保持package的名字和目录保持一致,尽量采取简短有意义的包名,不要和标准库名称冲突,包名应该为小写单词,不要使用下划线或者混合大小写

  4. 函数参数和返回值以小写字母开头

  5. 不要使用保留关键字作为标志符

  6. 不建议使用与预定义常量、类型、内置函数相同的名字作为标志符

  7. 专有名字通常全部大写

字面量

在计算机科学中,字面量是用于表达源代码中一个固定基本值的表示法(notation)。几乎所有计算机编程 语言都具有对基本值的字面量表示,比如:整数、浮点数、字符串、字符和布尔类型的数值都有对应的 字面量表示; 比如:数字15这个值是唯一的,但表示的方式有很多种:

二进制表达:1111
八进制表达:017
十进制表达:15
十六进制表达:0xF

对于开发者来说,当然知道要表达的意思,但是要把这种思想传达给编译器, 因为编译器对源代码做词法分析时会自动判决当前用户的输入属于哪一类字面量;

go语言的字面量与变量类型应关系:

字面量种类变量的类型举例
布尔booltrue/false
字符rune包含在单引号''之中的字符
整型int15, 017与0xF
浮点float640.,1.1,1.e+0.1E6,.25,.25e+5
复数complex128
字符串string包含在双引号 ""或反引号 ``之中

举例说明一下:

package聽mainimport聽(聽聽聽聽"fmt"
聽聽聽聽"reflect")func聽main()聽{
聽聽聽聽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))
}
输出:15聽int0.25聽float6499聽int32go聽string(0+11i)聽complex128

字面量的通俗理解:编译器根据用户的输入,推论出输入的数据属于什么数据类型。


本文出自 “博学于文,约之于礼” 博客,转载请与作者联系!


有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:100018

查看原文:golang 基本词法

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1111 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传