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 MIPS, updates the compiler back end to generate more efficient code, reduces GC pauses by eliminating stop-the-world stack rescanning,adds HTTP/2 Push support, adds HTTP graceful shutdown, adds 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 bytes
, crypto/aes
,crypto/cipher
, crypto/elliptic
, crypto/sha256
, crypto/sha512
, encoding/asn1
,encoding/csv
, encoding/hex
, encoding/json
, hash/crc32
, image/color
, image/draw
,math
, math/big
, reflect
, regexp
, runtime
, strconv
, strings
, syscall
, text/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
未完待续。。。
有疑问加站长微信联系(非本文作者)