V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
liulaomo
V2EX  ›  Go 编程语言

Go 语言将在 1.13 版本中引入的变化

  •  
  •   liulaomo · 2019-04-27 18:33:15 +08:00 · 5818 次点击
    这是一个创建于 2021 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从 Go 1.0 发布到当前的 1.12 版本,Go 语言本身的语法改动非常少。这使得一本五年前出版的 Go 语言编程书在当前看来仍然不是很过时。

    去年,Go 官方设计团队宣布了 Go 2 计划。Go 2 只是一个象征性名词,它并不代表着 Go 2.x 版本,而是表示 Go 语言将在后续版本中迎来较大变化。Go 1.13 将是一个开始此大变化的起步版本。本文余下的部分将列出一些(可能)在 Go 1.13 中将引入的变化。

    1. 移位操作中的右操作数将允许为有符号整数

    截至目前,移位操作(<<>>)中的右操作数必须为无符号类型确定整数或者可以表示成uint值的类型不确定值。从 Go 1.13 开始,移位操作中的右操作数将可以是任何整数类型(包括有符号类型)的类型确定值或者可以表示成任何整数类型的不确定值。但是如果一个右操作数是一个常量,则它仍旧必须为非负。

    比如,下面这行在 Go 1.12-版本中编译不过,但是从 Go 1.13 开始,将编译没问题。

    var _ = 1 << int(5)
    

    注意,当一个非常量负整数被用作移位操作中的右操作数时,此操作将造成一个恐慌,比如下面这段代码:

    var x = -2
    var _ = 1 << x // panic!
    

    2. 更多的数值字面表示形式

    截至 Go 1.12 ,Go 只支持三种整数字面表示形式:十六进制形式、八进制形式和十进制形式。比如,下面是十进制数 15 的三种字面表示形式:

    0xF // 十六进制表示(必须使用 0x 或者 0X 开头)
    017 // 八进制表示(必须使用 0 开头)
    15  // 十进制表示(必须不能用 0 开头)
    

    Go 1.13 将引入二进制表示形式(千呼万唤始出来)。二进制形式必须使用0b或者0B开头,后面跟随的数字只能为01。一个示例:

    0b11001 // 十进制的 25 的二进制字面表示
    0B111   // 十进制的 7 的二进制字面表示
    

    从 Go 1.13 开始,八进制数除了目前的使用 0 开头,将也可以使用0o或者0O开头。比如,下面三个八进制表示是等价的。

    017  // 15 的八进制表示
    0o17 // 15 的八进制表示
    0O17 // 15 的八进制表示
    

    另外,浮点数的字面表示形式也得到了扩充。可以在内存中精确表示的浮点数将可以用十六进制文字表示来表示。

    • 和整数的十六进制文字表示一样,浮点数的十六进制文字表示也必须使用0x或者0X开头。
    • 和整数的十六进制文字表示不同的是,字母p或者P可以出现在浮点数的十六进制文字表示中,其后跟随着一个幂指数。
    • 另外要注意,eE不能出现在浮点数的十六进制文字表示中。

    一些浮点数的十六进制文字表示例子:

    0x1p-2     // == 0.25
    0x2.p10    // == 2048.0
    0x1.Fp+0   // == 1.9375
    0X.8p-0    // == 0.5
    0X1FFFP-16 // == 0.1249847412109375
    

    而下面这几个均不是合法的浮点数的十六进制文字表示。

    0x.p1    // 浮点数的十六进制文字表示必须包含至少一个数字
    1p-2     // p 指数形式只能出现在浮点数的十六进制文字表示中
    0x1.5e-2 // e 和 E 不能出现在浮点数的十六进制文字表示中
    

    下面这个表示是合法的,但是它不是浮点数的十六进制文字表示。事实上,它是一个减法算术表达式。其中的e为是十进制中的 14,0x15e为一个整数十六进制文字表示,-2并不是此整数十六进制文字表示的一部分。

    0x15e-2 // == 0x15e - 2 (整数相减表达式)
    

    数值字面表示形式的最后一点改动是:下划线_可以出现在数值字面表示形式中用做分段符以增强可读性。但是要注意,在一个数值字面表示中,一个下划线_不能出现在此字面表示的首尾,并且其两侧的字符必须为(相应进制的)数字字符或者进制表示头。

    一些合法和不合法使用下划线的例子:

    // 合法的使用下划线的例子
    6_9          // == 69
    0_33_77_22   // == 0337722
    0x_Bad_Face  // == 0xBadFace
    0X_1F_FFP-16 // == 0X1FFFP-16
    
    // 非法的使用下划线的例子
    _69        // 下划线不能出现在首尾
    69_        // 下划线不能出现在首尾
    6__9       // 下划线不能相连
    0_xBadFace // x 不是一个合法的八进制数字
    1_.5       // .不是一个合法的十进制数字
    1._5       // .不是一个合法的十进制数字
    

    3. 对 errors 标准库包的功能的增强

    除了上述语法变化,Go 1.13 中很可能将对 errors 标准库包的功能(当前只包含一个原型为func New(text string) error的函数)进行增强。由于篇幅原因,本文将不详述这些增强,本文在这里只是简单概括一下。对 errors 标准库包功能的增强本公众号将另开一篇文章详述。

    简单说来,Go 1.13 主要将对errors标准库包做出如下增强:

    • 支持 error 包裹嵌套(即支持 error 链)。
    • 支持更好的 error 跟踪调试体验。
    • 支持更完美的 error 格式打印。

    本文首发在微信 Go 101 公众号,欢迎各位转载本文。Go 101 公众号将尽量在每个工作日发表一篇原创短文,有意关注者请扫描下面的二维码。

    101-group-qrcode-1.jpg

    8 条回复    2019-04-28 15:40:32 +08:00
    guonaihong
        1
    guonaihong  
       2019-04-27 18:54:10 +08:00
    和整数的十六进制文字表示不同的是,字母 p 或者 P 可以出现在浮点数的十六进制文字表示中,其后跟随着一个幂指数。这是好东西,估计 fmt.Printf 也会更接近 c 里面 printf 的行为
    ntop
        2
    ntop  
       2019-04-27 19:22:04 +08:00
    二进制表示形式这个挺有用的!
    WilliamYang
        3
    WilliamYang  
       2019-04-27 20:00:04 +08:00
    我只关心 go 说好的 1.3 会加入 xml 支持 namespace 的功能是否真的有, 因为要用到
    whoisghost
        4
    whoisghost  
       2019-04-27 20:45:44 +08:00
    变复杂了,可以弃坑了,还是回去用 c 写 hello world.
    naixiaoxin
        5
    naixiaoxin  
       2019-04-27 20:52:34 +08:00   ❤️ 1
    期待 error 的包增强。。golang 的 error 用起来实在是有点强迫症。。
    kxjhlele
        6
    kxjhlele  
       2019-04-28 07:10:30 +08:00 via Android
    @WilliamYang 我看 issues 说 xml 库开发人员都没有了
    WilliamYang
        7
    WilliamYang  
       2019-04-28 09:27:52 +08:00
    @kxjhlele 哈, 请问是哪个 issue 啊, 谢谢? 居然是这样的结果..
    robot1
        8
    robot1  
       2019-04-28 15:40:32 +08:00
    这种改变太小了,更期待泛型、错误处理方式这种改变
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3384 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:49 · PVG 18:49 · LAX 02:49 · JFK 05:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.