Golang(四)语言特性

Golang是一种强类型的通用系统编程语言,具有垃圾回收机制并明确支持并发编程。go程序由包构成,这允许对依赖关系进行高效的管理;它的语法规则且紧凑,允许通过诸如集成开发环境之类的自动化工具进行简单的分析.......都是关于Golang语言特性的一些总结,本文将结合官方文档对Golang的语言特性进行一一阐述

记法

使用扩展的Backus-Naur格式(EBNF)指定语法格式,形如

    Production  = production_name "=" [ Expression ] "." .
    Expression  = Alternative { "|" Alternative } .
    Alternative = Term { Term } .
    Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
    Group       = "(" Expression ")" .
    Option      = "[" Expression "]" .
    Repetition  = "{" Expression "}" .

Productions是由terms和下列运算符构成的表达式,优先级逐渐递增

    |   alternation
    ()  grouping
    []  option (0 or 1 times)
    {}  repetition (0 to n times)

小写的production_name用于标识词汇标记,非终结符使用驼峰命名法,词汇标记用双引号""或反引号``括起来

"a...b"形式表示从a到b的可选字符集;省略号(...)也用于非正式地表示未进一步指定的各种枚举或代码段,省略号...(不同于. . .)不是go语言的符号

源代码表示

源代码是用UTF-8编码的Unicode文本。这个文本不是规范化的,所以单个重音代码点不同于由重音和字母组合构成的相同字符;那些被视为两个代码点。为了简单起见,本文将使用非限定术语字符来引用源文本中的Unicode代码点

每个代码点都是不同的;例如,大写字母和小写字母表示的是不同的字符

实现限制:为了与其他工具兼容,编译器kennel不会允许源代码中出现NUL(U 0000)字符; 如果源代码文本中的第一个Unicode代码点是UTF-8编码的字节顺序标记(U FEFF),编译器可能会忽略它

字符 以下术语用于表示特定的Unicode字符类

    newline        = /* the Unicode code point U 000A */ .
    unicode_char   = /* an arbitrary Unicode code point except newline */ .
    unicode_letter = /* a Unicode code point classified as "Letter" */ .
    unicode_digit  = /* a Unicode code point classified as "Number, decimal digit" */ .

在Unicode 8.0标准中的第4.5节"通用分类"定义了字符分类集,go将Lu, Ll, Lt, Lm, 或 Lo字母类中的所有字符作为Unicode字母对待,而将所有数字类Nd中的字符作为Unicode数字

字母和数字 下划线字符_(U 005F)被视为一个字母

    letter        = unicode_letter | "_" .
    decimal_digit = "0" … "9" .
    binary_digit  = "0" | "1" .
    octal_digit   = "0" … "7" .
    hex_digit     = "0" … "9" | "A" … "F" | "a" … "f" .

词汇元素

注释 用作程序文档,有两种格式

  • 行注释以字符序列 // 开始,并在行的末尾结束
  • 块注释从字符序列 / 开始,并用后续第一个字符序列 / 停止

注释不能在宽字符、字符串文字内或注释内启动;块注释就像一个空间,可以包含任意数量换行符

词汇 有四类:标识符、关键字、运算符和标点符号以及文字。由空格(U 0020)、水平制表符(U 0009)、回车符(U 000D)和换行符(U 000A)组成的空白将被忽略,除非它作为词汇的分隔符否则将被合并为单个词汇。此外,换行符或文件结尾可以触发分号的插入。在将输入分解为词汇时,下一个词汇是形成有效词汇的字符的最长序列

分号 形式语法使用分号";"作为多个productions中的终止符,go程序可以使用以下两个规则省略大部分分号

1.当输入被分解为词汇时,分号会被自动插入到行的最后一个词汇标记之后,如果该词汇是

  • 一个标识符
  • 整数、浮点、虚数、宽字符(rune)或字符串文字
  • 关键字break、continue、fallthrough或return之一
  • 运算符和标点符号 、--、)、]或} 之一

2.为了允许复杂语句占用一行,可以在结束")"或"}"之前省略分号

标识符 标识符命名程序实体,如变量和类型。标识符是一个或多个字母和数字的序列。标识符中的第一个字符必须是字母

    identifier = letter { letter | unicode_digit } .

预先声明一些标识符

    a
    _x9  // invalid
    ThisVariableIsExported
    αβ

关键字 以下保留关键字,不能用作标识符

    break        default      func         interface    select
    case         defer        go           map          struct
    chan         else         goto         package      switch
    const        fallthrough  if           range        type
    continue     for          import       return       var

运算符和标点符号 下面的字符序列表示运算符(包括赋值运算符)和标点符号

         &      =    &=     &&    ==    !=    (    )
    -    |     -=    |=     ||    <     <=    [    ]
    *    ^     *=    ^=     <-    >     >=    {    }
    /    <<    /=    <<=          =     :=    ,    ;
    %    >>    %=    >>=    --    !     ...   .    :
             &^          &^=

整数字面值 整数文字是表示整数常量的一系列数字。非十进制可选前缀设置表示法: 二进制0b或0B、八进制0, 0o或0O、十六进制0x或0X; 单个0被认为是十进制的0; 在十六进制的文本中,a~f或A~F代表十进制值10~15

为了可读性,下划线字符(_)可能出现在基前缀或连续数字之间;这样的下划线不会改变文字的值

    int_lit        = decimal_lit | binary_lit | octal_lit | hex_lit .
    decimal_lit    = "0" | ( "1" … "9" ) [ [ "_" ] decimal_digits ] .
    binary_lit     = "0" ( "b" | "B" ) [ "_" ] binary_digits .
    octal_lit      = "0" [ "o" | "O" ] [ "_" ] octal_digits .
    hex_lit        = "0" ( "x" | "X" ) [ "_" ] hex_digits .
    decimal_digits = decimal_digit { [ "_" ] decimal_digit } .
    binary_digits  = binary_digit { [ "_" ] binary_digit } .
    octal_digits   = octal_digit { [ "_" ] octal_digit } .
    hex_digits     = hex_digit { [ "_" ] hex_digit } .
    42 -> 4_2
    0600 -> 0_600
    0o600
    0O600       // 第二个字符是大写字母'O'
    0xBadFace -> 0xBad_Face
    0x_67_7a_2f_cc_40_c6
    170141183460469231731687303715884105727 -> 170_141183_460469_231731_687303_715884_105727
    _42         // 表示一个标识符而不是数字
    42_         // 非法: _ 必须分隔连续的数字
    4__2        // 非法: _ 仅出现一次
    0_xBadFace  // 非法: _ 必须分隔连续数字

浮点字面值 浮点文字是浮点常量的十进制或十六进制表示形式

十进制浮点文字由整数部分(十进制数字)、小数点、小数部分(十进制数字)和指数部分(后跟可选符号e或E和十进制数字)组成。整数部分或小数部分之一可以省略;小数点部分或指数部分之一可以省略。指数值exp将尾数(整数和小数部分)按10exp缩放

十六进制浮点文字由0x或0X前缀、整数部分(十六进制数字)、基数点、小数部分(十六进制数字)和指数部分(后面跟着一个可选的符号p或P和十进制数字)组成。整数部分或小数部分之一可以省略;基点也可以省略,但指数部分是必需的。(此语法与IEEE754-2008第5.12.3节中给出的语法相匹配)指数值exp将尾数(整数和小数部分)按2exp缩放

为了可读性,下划线字符(_)可能出现在基前缀或连续数字之间;这样的下划线不会改变文字值

    float_lit         = decimal_float_lit | hex_float_lit .
    decimal_float_lit = decimal_digits "." [ decimal_digits ] [ decimal_exponent ] |
                                            decimal_digits decimal_exponent |
                                            "." decimal_digits [ decimal_exponent ] .
    decimal_exponent  = ( "e" | "E" ) [ " " | "-" ] decimal_digits .
    hex_float_lit     = "0" ( "x" | "X" ) hex_mantissa hex_exponent .
    hex_mantissa      = [ "_" ] hex_digits "." [ hex_digits ] |
                                            [ "_" ] hex_digits |
                                            "." hex_digits .
    hex_exponent      = ( "p" | "P" ) [ " " | "-" ] decimal_digits .
    0.
    72.40
    072.40       // == 72.40
    2.71828
    1.e 0
    6.67428e-11
    1E6
    .25
    .12345E 5
    1_5.         // == 15.0
    0.15e 0_2    // == 15.0
    0x1p-2       // == 0.25
    0x2.p10      // == 2048.0
    0x1.Fp 0     // == 1.9375
    0X.8p-0      // == 0.5
    0X_1FFFP-16  // == 0.1249847412109375
    0x15e-2      // == 0x15e - 2 (integer subtraction)
    0x.p1        // 非法: 尾数(整数和小数部分)没有数字
    1p-2         // 非法: 指数p需要十六进制尾数
    0x1.5e-2     // 非法: 十六进制的尾数需要符号p(P)作为指数
    1_.5         // 非法: _ 必须分隔连续的数字
    1._5         // 非法: _ 同上
    1.5_e1       // 非法: _ 同上
    1.5e_1       // 非法: _ 同上
    1.5e1_       // 非法: _ 同上

虚数字面值 表示复数常量的虚部,它由一个整数或浮点文字组成,后面是小写字母i。虚文字的值是相应的整数或浮点文字乘以虚数单位i的值

    imaginary_lit = (decimal_digits | int_lit | float_lit) "i" .

考虑向后兼容性,一个虚文字的整数部分完全由十进制数字组成(可能包含下划线),即使它以0开头也被认为是一个十进制整数

    0i
    0123i         // == 123i 向后兼容
    0o123i        // == 0o123 * 1i == 83i
    0xabci        // == 0xabc * 1i == 2748i
    0.i
    2.71828i
    1.e 0i
    6.67428e-11i
    1E6i
    .25i
    .12345E 5i
    0x1p-2i       // == 0x1p-2 * 1i == 0.25i

宽字符字面值 宽字符表示一个rune常数,标识Unicode代码点的整数值。宽字符表示为单引号中包含的一个或多个字符,如'x'或'n',在引号中,除换行符和非转义单引号外,可以出现任何字符。单引号字符表示字符本身的Unicode值,而以反斜杠开头的多字符序列以各种格式编码值

go源代码文本是用UTF-8编码的Unicode字符,所以多个UTF-8编码的字节可以表示单个整数值。例如,'a'占一个字节表示字母a(U 0061),而'ä'占两个字节(0xc3 0xa4),代表一个文字(U 00E4),值为0xe4

一些反斜杠转义允许任意值被编码为ASCII文本。将整数值表示为数字常量有四种方法: x 后跟两位十六进制数字; u 后跟四位十六进制数字; U 后跟八位十六进制数字; 一个简单反斜杠 后跟三位八进制数字。在每种情况下,文本的值都是由相应基中的数字表示的值

虽然这些都表示整数,但它们的有效值范围不同: 八进制转义表示[0,255]之间的值(包括0和255),十六进制转义通过构造满足此条件。u和U代表Unicode码点,如果转义大于0x10FFFF的值是非法的

特殊转义: 在反斜杠之后,某些单个字符转义表示特殊值

    \a   U 0007 alert or bell
    \b   U 0008 backspace
    \f   U 000C form feed
    \n   U 000A line feed or newline
    \r   U 000D carriage return
    \t   U 0009 horizontal tab
    \v   U 000b vertical tab
    \\   U 005c backslash
    \'   U 0027 single quote  (valid escape only within rune literals)
    \"   U 0022 double quote  (valid escape only within string literals)
    rune_lit         = "'" ( unicode_value | byte_value ) "'" .
    unicode_value    = unicode_char | little_u_value | big_u_value | escaped_char .
    byte_value       = octal_byte_value | hex_byte_value .
    octal_byte_value = `\` octal_digit octal_digit octal_digit .
    hex_byte_value   = `\` "x" hex_digit hex_digit .
    little_u_value   = `\` "u" hex_digit hex_digit hex_digit hex_digit .
    big_u_value      = `\` "U" hex_digit hex_digit hex_digit hex_digit
                                                         hex_digit hex_digit hex_digit hex_digit .
    escaped_char     = `\` ( "a" | "b" | "f" | "n" | "r" | "t" | "v" | `\` | "'" | `"` ) .

所有其他以反斜杠开头的序列在符文文本中都是非法的

    'a'
    'ä'
    '本'
    '\t'
    '\000'
    '\007'
    '\377'
    '\x07'
    '\xff'
    '\u12e4'
    '\U00101234'
    '\''         // rune literal containing single
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值