Go 语言将在 1.13 版本中引入的变化 - V2EX
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 6199 次点击
    这是一个创建于 2433 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从 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     Solana     3891 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:07 PVG 08:07 LAX 16:07 JFK 19:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86