惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Project Zero
Project Zero
博客园 - 聂微东
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
Jina AI
Jina AI
C
Check Point Blog
博客园_首页
The GitHub Blog
The GitHub Blog
The Hacker News
The Hacker News
T
The Blog of Author Tim Ferriss
V
Vulnerabilities – Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cisco Blogs
人人都是产品经理
人人都是产品经理
V
Visual Studio Blog
A
Arctic Wolf
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Forbes - Security
Forbes - Security
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
T
Troy Hunt's Blog
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
Schneier on Security
Schneier on Security
K
Kaspersky official blog
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Register - Security
The Register - Security
P
Proofpoint News Feed
小众软件
小众软件
S
Securelist
T
Tor Project blog

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 业务规则引擎演变过程简述 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - Sidecar 模式 Kubernetes 应用最佳实践 - init 容器和钩子函数 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式 Go 内存模型 Kubernetes 核心概念
Go 1.20 发布了
2023-02-11 · via 蛮荆

2023-02-11 Golang

前言

这几天所有的热度都集中到了 ChatGPT,不过我对这件事情没有什么兴趣,原本计划换换脑,看一下 Docker 基础相关技术,恰巧这时 兔兔大佬 发来了灵魂拷问 …

你写不写?

果然,我的驱动力主要来自外界,于是乎,就有了官网文章的这篇翻译版 (官方文章中不重要的细节忽略了,想一览无余的读者参考附录链接 1)。

PGO

Go 1.20 发布了 配置文件引导优化 (PGO) 的预览版,使编译器能够根据运行时配置文件信息,执行应用程序和工作负载的特定性优化。 提供要构建的配置文件,使编译器能够将应用程序的速度提高大约 3–4%,官方鼓励开发者尝试一下整个特性,但是可能存在一些未知的小问题。

具体可参考 Profile-guided optimization

语言变化

  • 切片可以直接转换为数组
  • unsafe 包中添加了 Slice, SliceData, String, StringData 函数

切片转数组示例

package main

import "fmt"

func main() {
	sli := []int{1, 2, 3, 4, 5}
	arr := [5]int(sli)
	fmt.Println(arr)
}

// 输出如下
// [1 2 3 4 5]

unsafe 包中新增函数原型

package unsafe

// Slice 根据指针参数和长度参数构造一个切片并返回
//       修改切片元素值会影响底层的数组元素值
func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType

// SliceData 返回参数切片的指针
func SliceData(slice []ArbitraryType) *ArbitraryType

// String 根据指针参数和长度参数构造一个字符串并返回
//        修改参数指向的值会同时修改字符串的值
func String(ptr *byte, len IntegerType) string

// StringData 返回参数字符串底层的字节数组指针
func StringData(str string) *byte

下面是两个小例子,分别使用到了 Slice 函数和 String 函数。

根据数组生成切片

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	arr := [5]int{1, 2, 3, 4, 5}
	// 注意: 这里是传递首个元素的指针,而非数组的指针
	sli := unsafe.Slice(&arr[0], 3)
	fmt.Printf("slice = %+v, len = %d\n", sli, len(sli))

	// 修改切片元素的值会影响底层的数组
	for i := range sli {
		sli[i] *= 100
	}
	fmt.Printf("slice = %+v, len = %d\n", sli, len(sli))
	// 此时数组的元素值已经变化
	fmt.Printf("array = %+v, len = %d\n", arr, len(arr))
}


// 运行输出如下
// slice = [1 2 3], len = 3
// slice = [100 200 300], len = 3
// array = [100 200 300 4 5], len = 5

根据切片生成字符串

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	bs := []byte{'h', 'e', 'l', 'l', 'o'}
	// 注意: 这里是传递首个元素的指针,而非切片的指针
	str := unsafe.String(&bs[0], 2)
	fmt.Printf("str = %s, len = %d\n", str, len(str))

	// 修改参数指向的值会同时修改字符串的值
	bs[1] = 'i'
	
	// 此时字符串的值已经变化
	fmt.Printf("str = %s, len = %d\n", str, len(str))
	fmt.Printf("bs = %s, len = %d\n", bs, len(str))
}

// 运行输出如下
// str = he, len = 2 
// str = hi, len = 2 
// bs = hillo, len = 2

工具改进

  • cover 工具可以收集整个程序的覆盖率,不仅仅是单元测试
  • go buildgo install 和其他与构建相关的命令可以接收一个 -pgo 标志,启用配置文件引导优化,以及一个 -cover 标志,用于整个程序覆盖率分析
  • go test -json 的实现已得到改进,可以处理复杂多样的 Stdout 输出
  • vet 在并行运行的测试中可能会发生更多循环变量引用错误
  • 没有 C 工具链 的系统上默认禁用 CGO

标准库增强

  • 新方法 errors.Join 返回一个错误列表,如果错误类型实现了 Unwrap() []error,则可以再次获得错误列表
  • 新增了几个 时间转换格式常量,不用再死记硬背蛋疼的 2006-01-02 15:04:05 了 :-)
  • 新包 crypto/ecdh 支持通过 NIST 曲线和 Curve25519 椭圆曲线 Diffie-Hellman 密钥交换
  • 新类型 http.ResponseController 访问 http.ResponseWriter 接口未处理的扩展请求
  • httputil.ReverseProxy 包含一个新的 Rewrite 钩子函数,取代了之前的 Director 钩子
  • 新方法 context.WithCancelCause 提供了一种方法来取消具有给定错误的上下文
  • os/exec.Cmd 结构体中的新字段 Cancel 和 WaitDelay, 指定 Cmd 在其关联的 Context 被取消或其进程退出时的回调

errors.Join 示例

package main

import (
	"errors"
	"fmt"
)

func main() {
	err1 := errors.New("error1")
	err2 := errors.New("error2")
	err3 := errors.New("error3")

	err := errors.Join(err1, err2, err3)
	fmt.Println(err)
}

时间转换格式常量

package time

const (
	DateTime   = "2006-01-02 15:04:05"
	DateOnly   = "2006-01-02"
	TimeOnly   = "15:04:05"
)

性能提升

  • 编译器和 GC 的优化减少了内存开销,并将 CPU 性能整体提高了 2%
  • 针对编译时间进行了优化,提升了 10%。使得构建速度与 Go 1.17 保持一致 (恢复到了泛型之前的速度)

从 1.21 版本开始,一些较旧的操作系统将不再受支持:包括 Windows 7、8、Server 2008 和 Server 2012、macOS 10.13 High Sierra 和 10.14 Mojave。

小结

总体来说,基本没有新的功能和特性,在旧的版本基础上,按图索骥即可。

Reference

  1. Go 1.20 is released!