咀嚼 go 1.8

panda1986_meng · · 1365 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

2017.02.16 go发布了1.8版本,花时间拜读和翻译下,有必要的话,升个级。先开个头,免得忘了。

panda  2017.03.19 11:20 

 

Go 1.7 发布之后的6个月,Go最新版1.8发不了。1.8的改变大部分是对toolchain, runtime,libraries的完善; 还有2个语言规范方面的微小变化。此版本像往常一样,是向下兼容的。

 

adds support for 32-bit MIPSupdates the compiler back end to generate more efficient code, reduces GC pauses by eliminating stop-the-world stack rescanning,adds HTTP/2 Push supportadds HTTP graceful shutdownadds more context support,enables profiling mutexes, and simplifies sorting slices.

说实话,第一句没太看懂。。。

新增了HTTP/2 Server push 的支持, 关于此技术可以参考 http://www.open-open.com/lib/view/open1483537725037.html (HTTP2 Server Push的研究)

新增了HTTP graceful shutdown

增加了更多的context支持

启用了profiling muteness

简化了slices的排序

  • Changes to Language 语言的变化

            当明确的想把一个value从一个struct转换成另一个struct, 1.8中忽略了tags;

            图中两个结构体的不同在于X的tag是不一样的,所以可以直接转换。

  • func example() {
            type T1 struct {
                    X int `json:"foo"`
            }
            type T2 struct {
                    X int `json:"bar"`
            }
            var v1 T1
            var v2 T2
            v1 = T1(v2) // now legal
    }
  • Ports 

            Go 1.8 只支持OS X 10.8 或者更新的。

            Go 1.8 将是最后一个版本支持 linux 操作系统在ARMv5E和ARMv6上了。 Go 1.9 将要求ARMv6K或者更新。 确认某linux系统是不是ARMv6K或者更新,执行

> go tool dist-check-armv6k

            Go 1.8在FreeBSD和NetBSD上有些不稳定,还没查到原因,在少数情况下可能会造成程序直接挂掉。参考issues: https://golang.org/issue/15658  https://golang.org/issue/16511   热切期待能解决这些问题的任何帮助。

 

  • Runtime
    • Concurrent Map issue

                        Go 1.8通过检测程序同时读写一个map, 改善了检测map的concurrent 问题

                        通常,如果一个goroutine正在写一个map, 不应该有其他grouting同时读或者写此map. 如果runtime检测到此种情况,会打印诊断信息,并crash. 查找这种问题的最佳方案就是在race detector的模式下运行程序,关于race detector 可以参考:https://blog.golang.org/race-detector

  • MemStats 

                    为了让程序运行的更快,加速了垃圾回收,并优化了一些标准库

There have been optimizations to implementations in the bytescrypto/aes,crypto/ciphercrypto/ellipticcrypto/sha256crypto/sha512encoding/asn1,encoding/csvencoding/hexencoding/jsonhash/crc32image/colorimage/draw,mathmath/bigreflectregexpruntimestrconvstringssyscalltext/template, and unicode/utf8 packages.

 

  • Sort

                    sort package 用起来更便捷了,大多数情况下,不用自己写struct来实现sort接口了。

  • HTTP/2 Push

                  net/http package 新增一种从Handler发送Http/2 server pushes的机制。跟已存在的Flusher和Hijacker接口比较像,HTTP/2 的ResponseWriter 完善了新的Pusher接口。

  • More Context Support

                    继Go 1.7 将context.Context放进标准库后,Go1.8新增了更多的context

  • Mutex Contention Profiling

                    大多数的用户会想用go test -mutexprofile, 然后再用proof分析结果

Lower-level support is also available via the new MutexProfile andSetMutexProfileFraction.


Go 1.8的一个已知的限制是mutex profile分析只针对sync.Mutext, 并不针对sync.RWMutex

  • archive/tar

                    tar  包校正了许多边边角角的小bug, Reader 现在可以处理PAX格式(>8GB)的tar文件了。Writer在涉及很长的参数的情况下不再产生无效的tar文件。

  • compress/flate
  • compress/gzip
  • context
  • crypto/tls   这个是https相关的,用的比较少
  • crypto/x509 支持PSS签名
  • database/sql 这个需要测试下,现在好像也够用了
  • debug/pe 不知道干嘛的。。。
  • encoding/base64  增加了Encoding.Strict方法
  • encoding/binary Read和Write支持booleans
  • encoding/json 

                        UnmarshalTypeError 包含了struct和filed 名称

                        nil 会被encode成json null

  • encoding/pem decode对结尾行更严格
  • encoding/xml 
  • expvar 新增了Value的方法,用法参考:https://my.oschina.net/moooofly/blog/826460
  • fmt scanf, fscanf, sscanf 处理空格跟之前不一样了
  • go/doc
  • go/types
  • html/template
  • image/png
  • math/big
  • math/rand
  • mime
  • net
  • net/http

未完待续。。。


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:panda1986_meng

查看原文:咀嚼 go 1.8

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1365 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传