后浪笔记一零二四

token

token是构成源程序的基本不可再分割的单元。编译器编译源程序的第一步就是将源程序分割为一个个独立的token, 这个过程就是词法分析。Go语言的token可以分为标识符、操作符分隔符、字面常量。

1. 标识符

  • 预声明标识符:
    • 关键字(25个):
      • 引导程序整体结构的8个关键字: package, import, const, var, func, defer, go, return
      • 声明复合数据结构的4个关键字: struct, interface, map, chan
      • 控制程序结构的13个关键字: Go的源代码的顺序并不一定是编译后最终可执行程序的指令顺序, 这里面涉及语言的运行时和包的加载过程
        • if else 语句关键字:if, else,
          • Go语言没有条件运算符a>b?a:b,这符合Go的设计哲学,只提供一种方法做事情
        • for循环使用的关键字:for, range, break, continue
          • break和continue使用到标签时,标签和它们必须在同一函数内
        • switch和select语句使用的关键字:switch, select, type, case, default, fallthrough
          • switch和if语句一样,后面也可以带一个可选的初始化语句
          • switch后面的表达式也是可选的:
            • 没有表达式: case子句是一个布尔表达式,而不是一个值
            • 含有表达式: 表达式的值不像C语言那样必须限制为整数,可以是任意支持相等比较运算的类型变量
            • fallthrough:强制执行下一个case子句,不再判断下一个case子句的条件是否满足
        • 无条件跳转关键字:goto
          • goto语句只能在函数内跳转
          • goto语句不能跳过内部变量声明语句,这些变量在goto语句的标签语句处又是可见的
          • goto语句只能跳到同级作用域或者上层作用域内,不能跳到内部作用域内
    • 其他预声明标识符:
      • 内置数据类型标识符(20个):
        • 数值:
          • 整型(12个): byte, int, int8, int16, int32, int64(byte是uint8的同义词) uint,uint8,uint16,uint32,uint64,uintptr
          • 浮点型(2个):float32,float64(默认)
            • 计算机很难进行浮点数的精确表示和存储,因此两个浮点数之间不应该使用==!=进行比较操作
            • 高精度科学计算应该使用math标准库
          • 复数型(2个):complex64,complex128
            • 复数在计算机里面使用两个浮点数表示,一个表示实部,一个表示虚部。
            • complex64是由两个float32构成的,complex128是由两个float64构成的
            1
            2
            3
            4
            
            var vv complex64 = 3.1 + 5i  // 字面量形式
            var v = complex(2.1, 3)      // 使用complex内置函数创建
            a := real(v)                 // 返回复数实部
            b := imag(v)                 // 返回复数虚部
            
        • 字符和字符串型(2个):string rune(rune是int32的别名)
          • go默认使用utf-8编码,如果需要特殊的编码转换,需要使用unicode/utf8标准包
        • 接口型(1个):error
        • 布尔型(1个):bool
      • 常量值标识符(4个):iota, true, false, nil
      • 空白标识符(1个):_
      • 内置函数(15个): complex,real,imag make,new,len,cap,append,copy,delete print,println panic,recover close
  • 用户自定义标识符: 包名,变量名,常量名,函数名,方法名,自定义类型名。
    • 开头一个字符必须是字母或下划线,后面跟任意多个字符、数字或下划线
    • 区分大小写
    • Unicode字符也可以作为标识符的构成,但是一般不推荐这么使用
    • 要避开Go语言预定义标识符,以免引起混乱

2. 操作符分隔符

  • 纯分隔符(4个): 空格,制表符,回车和换行
  • 操作符(47个):不但起到分隔token的作用,本身也是一个token
    • 算术运算符(5): + - * / %
    • 位运算符(6): & | ^ &^(clear) » «
    • 赋值和复合赋值运算符(13): := = += -= *= /= %= &= |= ^= &^= »= «=
    • 比较运算符(6): > >= < <= == !=
    • 括号(6): () {} []
    • 逻辑运算符(3个): && || !
    • 自增自减操作符(2个): ++ –
    • 其他操作符(6): : , ; . … <-

3. 字面常量

  • 整型字面量: 0开头的是8进制,0x开头是16进制,0b开头是2进制。
  • 浮点型字面量 .12345E5 = 0.12345 * (10 ^ 5) .12345e5 = 0.12345 * (e ^ 5) 在golang中,e表示自然系数,E表示10
  • 复数类型字面量
  • 字符串字面量
  • 字符型字面量

4. 作用域

在高级编程语言中,作用域(scope)是指名字(name)与实体(可以理解为特定内存地址)的绑定(binding)保持有效的那部分程序逻辑区间。

Go语言是静态作用域的语言。

  • 所谓静态作用域就是变量的作用域不依赖程序执行时的因素,变量作用域在编译期就能确定。
  • Go语言有三种类型的作用域:
    • 全局作用域
      • Go语言内置的预声明标识符,它们具有全局作用域,在任意命名空间内都可见
      • Go语言包内以大写字母开头的标识符(包括变量、常量、函数和方法名、自定义类型、结构字段等),它们具有全局作用域
    • 包内作用域
      • 在Go语言包内定义的以小写字母开头的标识符(变量、常量、函数和方法名、自定义类型、结构字段等),它们在本包可见,在其他包都是不可见的,这些标识符具有包内作用域。
    • 隐式作用域
      • 每个代码块内定义的变量称为“局部变量”,这些局部变量只在当前代码块内可见,其作用域属于当前代码块的隐式作用域。

专题:

本文发表于 2022-09-13,最后修改于 2022-09-13。

本站永久域名「 jiavvc.top 」,也可搜索「 后浪笔记一零二四 」找到我。


上一篇 « Go 语言笔试面试题(并发编程) 下一篇 » 性能分析

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image