golang 基本词法

在编程语言中,词法是代码的构成法则。也就是说,词法规定了我们敲入怎样的字符才能编写出编译器 能够识别的代码,所以要掌握一门语言,那么语言的词法是我们要学习的第一步,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语言根据标志符名称中的第一个字母的大小写来确定该标志符的访问权限;具体规则是当标志符名称的第一个字符为小写时, 其访问权限就是"包级私有的",只有与该标志符在一个代码包的代码才能访问到它。 当标志符名称的第一个字符为大写时,其访问权限为"公开的",意味着该标志符可以被任何代码包的任何代码通过限定标志符访问。

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

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限定标志符}
注意:代码包标志符并不属于任何一个作用域,代码包声明只是为了区分若干源代码文件
是否属于同一个代码包。或者指定导入代码包时代表该代码包的引用名称。

命名建议:

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

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

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

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

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

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

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

字面量

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

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

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

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

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

举例说明一下:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


类型转换 1、int转string 2、string转int 3、string转float 4、用户结构类型转换
package main import s "strings" import "fmt" var p = fmt.Println func main() { p("Contains: ", s.Contains("test&quo
类使用:实现一个people中有一个sayhi的方法调用功能,代码如下: 接口使用:实现上面功能,代码如下:
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件信息 4、删除文件,成功返回true,失败返回false
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http://www.golangtc.com/downloadBeego开发文档地址:http://beego.me/docs/intro/ 安装步骤: 一、GO环境安装 二、配置系统变量 三、Beego安装 一、GO环境安装 根
golang获取程序运行路径:
Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考