查看原文
其他

Go 最新资讯:Go 1.16 正式发布,支持 macOS ARM64 架构

奇伢 奇伢云存储 2021-09-08

大纲


  • 多平台指令的支持

    • Darwin and iOS

    • NetBSD

    • OpenBSD

    • 386

    • RISC-V

  • 工具链

    • Go Command

    • Cgo

    • Vet

  • 运行时

  • 编译器

  • 链接器

  • 标准库

  • 总结


Go 1.16 release 版本今天正式发布。距离上个 Go 1.15 版本差不多 6 个月,所以这个版本迭代速度还是挺快的。本次更新没有对语言本身做变更,主要更新的是工具链,运行时( runtime ),标准库的一些功能实现和性能。Go 1.16 版本保持 Go 1 版本兼容性 的承诺。

相关地址

  • 更新公告地址:https://golang.org/doc/go1.16
  • 版本下载地址:https://golang.org/dl/

更新命令

$ go get golang.org/dl/go1.16
$ go1.16 download


多平台指令的支持


Darwin and iOS

  1. Go 1.16 支持 64 位 ARM 架构上的 macOS 操作系统 (Apple Silicon),使用方式通过 GOOS=darwin,GOARCH=arm64
  • 也就是 Apple 发布的最新的 M1 芯片指令集;
  • 至于之前 iOS 平台上的,则由 darwin/arm64 改名为 ios/arm64
  • Go 1.16 添加 ios/amd64 的类型;
  • Go 1.16 运行至少需要的系统版本 >= macOS 10.12 Sierra;

  • NetBSD


    Go 1.16 在 NetBSD(netbsd/arm64)上支持 64 位 ARM 体系架构。


    OpenBSD


    Go 1.16 在 OpenBSD(openbsd/mips64)上支持 MIPS64 体系架构,不支持 cgo。

    386


    Go 1.16 放弃了对 x87 模式编译(GO386=387)的支持。现在使用软浮动模式(GO386=softfloat)支持非 SSE2 处理器。在非 SSE2 处理器上运行的用户应替换GO386=387 为GO386=softfloat


    RISC-V


    Go 1.16 在 linux/riscv64 现在支持 cgo 和 -buildmode=pie 。Go 1.16 对 RISC-V 指令集做了部分的优化。


    工具链


    Go Command


    1. module-aware 模式成为默认状态。
    2. 支持使用 //go:embed 指令来将静态文件和文件树作为可执行文件的一部分直接内嵌包含在里面。

    Cgo


    1. cgo tool 不再转化 C 语言里的位域字段( C struct bitfields )对应到 Go 的结构体字段了(这一点要非常注意了,在使用 Cgo 的时候,这里没注意到的话,就会导致严重的 bug)。

    Vet


    1. 新增对无效测试场景的告警,比如单测某些场景对 Fatal 的无效调用;
    2. 新增对 frame pointer 的告警,这个主要是针对一些汇编代码,破坏了对 bp 寄存器的使用约定,Go 1.16 将会对这种检测出来并告警;
    3. 新增 asn1.Unmarshal 的警告,比如传递非指针对象或者 nil 值;

    运行时


    1. 新增 runtime/metrics 包的功能,替代runtime.ReadMemStats 和 debug.ReadGCStats,runtime/metrics 包更通用、稳定、高效;
    2. GODEBUG 环境变量支持跟踪:GODEBUG 环境变量包含inittrace=1 时,Go 运行时将会 trace 输出 package 的 init 函数的执行时间和一些内存分配情况;

    编译器


    1. 对内联的复杂场景的识别和优化,比如 Go 1.16 可以内联具有未标记 for 循环,方法值和类型判断的函数。 

    链接器


    1. 进一步优化链接阶段的性能,减少了链接程序资源的使用(时间和内存),并提高了代码的健壮性/可维护性。Go 1.16 链接平均比Go 1.15 的快20%-25%,消耗的内存减少 5%-15%(linux/amd64 平台数据)。

    标准库


    1. io/fs package 定义了fs.FS接口,它是文件只读树的抽象;
    2. 弃用 io/ioutil,存量功能迁出到其他具体的 package。比如 Discard => io.DiscardTempDir => os.MkdirTemp 等等。其实主要是迁入到 io 和 os 这两个 package;
    3. 对 Unicode 标准的支持从 12.0.0 升级为 13.0.0;
    4. net 标准库的实现中,在 Linux 上,在缺失 /etc/hosts 时,主机名查找不再使用 DNS /etc/nsswitch.conf。这个做法常见于基于 Musl 的系统,并使得 Go 程序与这些系统上 C 程序的行为相一致;

    总结


    1. Go 1.16 主要是 bugfix 和稳定性的提升,并没有重大的特性变化;
    2. Go 1.16 对多平台多指令架构做了更好的兼容,特别是对 2020 年 Apple 发布的 M1 芯片;
    3. Cgo tool 不再对 C 的位域做转换,这里要注意;
    4. Vet 新增了一些告警检测,让我们的语法检查更全面和安全;
    5. 链接阶段进一步提高了性能,链接速度更快并且耗费资源更少;
    6. Go 1.16 支持了静态资源文件的内嵌;
    7. 标准库 io/util 废弃,存量功能迁移到语义更明确的包,比 io 和 os ;
    8. 标准库 net 对于域名解析的行为和 musl-based 的系统一直;
    9. Unicode 支持升级为 13.0.0;

    往期推荐



    往期推荐



    Golang 最细节篇 — 解密 defer 原理,究竟背着程序猿做了多少事情?

    深入剖析 defer 原理篇 —— 函数调用的原理?

    Go 的 defer 的特性还是有必要要了解下的!!!

    Golang 并发编程核心篇 —— 内存可见性






    坚持思考,方向比努力更重要。关注我:奇伢云存储

    来都来了,点个“在看”再走叭~~             

    : . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存