golang 1.20正式发布,更好更易更强

这篇具有很好参考价值的文章主要介绍了golang 1.20正式发布,更好更易更强。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

预期中的Go 2不会有了,1.20也算是一个小gap,从中可以一窥Go未来的发展之路。对于Go来说,未来保持1.x持续演进和兼容性之外,重点就是让Go性能更优,同时保持大道至简原则,使用尽可能容易,从这两个方面带大家看看你1.20值得关注的特性。

优化相关

编译速度

1.18引入泛型,降低了编译速度,这一般版本基本上优化和1.17平齐,当前1.20的编译也是依赖Go 1.17版本自举。如果没泛型刚需的,可以等到1.20稳定后升级。

内存优化area

引入新的内存分配机制arena,支持手动管理内存,部分场景提升5%-15%,可参考golang新特性arena,带你起飞。

编译优化pgo

全称Profile-guided optimization (PGO),也是一项新的优化技术,通常提升3%-4%,简单说就是先跑一遍程序生成pprof文件,然后基于此文件引导编译器优化再编译一遍。当前只实现内联的优化,后续可能增加多种优化,个人理解有点类似离线版本JIT。

发行体积

安装包安装,$GOROOT/pkg 目录将不再存储标准库的预编译包存档,相比之前减少1/3。

默认禁用 CGO

在没有C toolchain的系统上默认禁用 CGO,相比依赖CGO的标准库,此情况编译只依赖pure Go。

代码编写

可以看到,Go新版本代码编写演进总的原则就是简化写代码的心智负担,普通开发者只需要关心实现即可,尽可能少的和底层实现绑定。

多error wrap

在1.13基础上,增加多error wrap的能力,类似功能不用再依赖外部库(hashicorp/go-multierror库等)。
使用很简单,如下,多个%w格式化即可wrap,同时支持Is和As

func TestMultiWrap(t *testing.T) {
	err1 := errors.New("Error 1")
	err2 := errors.New("Error 2")
	err3 := errors.New("Error 3")

	err := fmt.Errorf("%w,%w,%w", err1, err2, err3)

	fmt.Printf("wrap errors:%v\n", err)

	fmt.Printf("is err1:%v, is err2:%v, is err3:%v\n",
		errors.Is(err, err1),
		errors.Is(err, err2),
		errors.Is(err, err3))
}

输出

wrap errors:Error 1,Error 2,Error 3
is err1:true, is err2:true, is err3:true

slice转array

在1.20之前,slice转array需要了解底层原理,如下实现,不是特别直观

	slice := []int{1, 2, 3, 4, 5}

	// 老方法
	array1 := *(*[5]int)(slice)

1.20引入直接转换实现,降低新手入门难度,更加直观,如下操作即可

	//新方法
	// 1.20之前报错 cannot convert slice (variable of type []int) to type [5]int
	array2 := [5]int(slice)

	//array22 := [6]int(slice)
	//fmt.Printf("Array:%v\n", array22)

注意目标数组长度不能大于slice长度,否则报错

// panic: runtime error: cannot convert slice with length 5 to array or pointer to array with length 6

bytes string互转

在1.20之前,bytes/string互转需要了解底层实现,借助unsafe代码来实现如下

func OldBytesToString(b []byte) string {
	return *((*string)(unsafe.Pointer(&b)))
}

func OldStringToBytes(s string) []byte {
	stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&s))

	var b []byte
	pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) // 先引用,防止原有string gc
	pbytes.Data = stringHeader.Data
	pbytes.Len = stringHeader.Len
	pbytes.Cap = stringHeader.Len

	return b
}

1.20中,官方提供如下三个函数包装下底层实现

  • func String(ptr *byte, len IntegerType) string:根据数据指针和字符长度构造一个新的 string。
  • func StringData(str string) *byte:返回指向该 string 的字节数组的数据指针。
  • func SliceData(slice []ArbitraryType) *ArbitraryType:返回该 slice 的数据指针。

以往常用的 reflect.SliceHeader 和 reflect.StringHeader 将会被标注为被废弃。
互转代码大大简化,可如下实现

func NewBytesToString(b []byte) string {
	return unsafe.String(&b[0], len(b))
}

func NewStringToBytes(s string) []byte {
	return unsafe.Slice(unsafe.StringData(s), len(s))
}

时间格式化和比较

在1.20之前,时间格式化只能用别扭的2006-01-02 15:04:05语法,可能创始人觉得Geek吧,扛不住刚需,现在终于支持常见的如下三种格式化语法,不知道啥时候能把YYmmdd加进来

func TestTimeFormat(t *testing.T) {
	tm1 := time.Now()

	fmt.Printf("DateTime-%v\nDateOnly-%v\nTimeOnly-%v\n",
		tm1.Format(time.DateTime),
		tm1.Format(time.DateOnly),
		tm1.Format(time.TimeOnly))
}

输出

DateTime-2023-02-09 00:43:13
DateOnly-2023-02-09
TimeOnly-00:43:13

另外就是,相比之前的After/Before比较,新引入一个Compare方法,比较上更加直观和方便

func TestTimeCompare(t *testing.T) {
	tm1 := time.Now()
	tm2 := time.Now()

	c := tm1.Compare(tm2)
	if c == -1 {
		fmt.Println("tm1 < tm2")
	} else if c == 0 {
		fmt.Println("tm1 = tm2")
	} else if c == 1 {
		fmt.Println("tm1 > tm2")
	}
}

参考

代码 https://gitee.com/wenzhou1219/go-in-prod/tree/master/go_120_feature文章来源地址https://www.toymoban.com/news/detail-442017.html

  • Go1.20 那些事:错误处理优化、编译速度提高、PGO 提效等新特性,你知道多少?
  • Go 1.20 is released! - The Go Programming Language
  • What’s New in Go 1.20, Part I: Language Changes
  • Exploring Go’s Profile-Guided Optimizations
  • PGO 是啥,咋就让 Go 更快更猛了?
  • GopherCon 2022: Russ Cox - Compatibility: How Go Programs Keep Working: https://www.youtube.com/watch?v=v24wrd3RwGo

到了这里,关于golang 1.20正式发布,更好更易更强的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二级制部署kubernetes(1.20)

    😘作者简介:一名运维工作人员。 👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。 🙏创作不易,动动小手给个点赞加关注吧,有什么意见评论区告诉我,一起学习。  生产环境中有两种部署k8s的方法:         kubeadm Kubeadm是一个K8s部署工具,提

    2024年02月14日
    浏览(34)
  • AlmaLinux 9 安装 Go 1.20

    访问 https://go.dev/dl/,下载你想安装的版本,比如 go1.20.7.linux-amd64.tar.gz, (可选)删除旧版本, 安装 go, refer: https://go.dev/doc/install 完结!

    2024年02月14日
    浏览(36)
  • 二进制部署kubernetes(1.20)

    😘作者简介:一名运维工作人员。 👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。 🙏创作不易,动动小手给个点赞加关注吧,有什么意见评论区告诉我,一起学习。  生产环境中有两种部署k8s的方法:         kubeadm Kubeadm是一个K8s部署工具,提

    2024年02月11日
    浏览(41)
  • k8s1.20二进制包安装

    主机IP地址 主机名 主机角色 主机配置 软件列表 10.58.32.31 k8s-master01 master,LB 2C4G kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、docker,haproxy、keepalived 10.58.32.32 k8s-master02 master,LB 2C4G kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、dock

    2024年02月16日
    浏览(40)
  • Kubeadm - K8S1.20 - 高可用集群部署(博客)

    1.系统设置 注意事项: master节点cpu核心数要求大于2 ●最新的版本不一定好,但相对于旧版本,核心功能稳定,但新增功能、接口相对不稳 ●学会一个版本的 高可用部署,其他版本操作都差不多 ●宿主机尽量升级到CentOS 7.9 ●内核kernel升级到 4.19+ 这种稳定的内核 ●部署k8

    2024年02月05日
    浏览(43)
  • kubeadm 升级 k8s集群 1.17到1.20

    云原生学习路线导航页(持续更新中) 本文是 Kubernetes 基础学习 系列文章,主要讲解 使用kubeadm ,将kubernetes集群从1.17升级到1.20 一般来说,跨越多个主要版本的升级需要逐个升级每个中间版本 因此,无法直接将kubernetes从1.17直接升级到1.20或更高版本,需要按照1.17–1.18–

    2024年04月22日
    浏览(40)
  • k8s1.20集群域名与集群ip解析详解及使用案例

    目录 一.k8s中的域名解析浅析 1.单机 2.k8s的容器中 二.k8s不同版本对应的dns域名服务组件

    2024年02月09日
    浏览(38)
  • k8s集群网络插件搭建——————解决集群notready(k8s1.20版本,docker24)

            前面已经提到,在初始化 k8s-master 时并没有网络相关配置,所以无法跟 node 节点通信,因此状态都是“NotReady”。但是通过 kubeadm join 加入的 node 节点已经在k8s-master 上可以看到。  那么,这个时候我们该怎么办呢???????? 安装flannel         Master 节点

    2024年02月13日
    浏览(40)
  • 重磅!OpenAI突然发布企业版ChatGPT:没有限制、更快、更强、更安全的GPT-4

    这是由【 小瑶智能体】 AI创作的第 4 篇科技文章     大模型研究测试传送门 GPT-4传送门(免墙,可直接测试,遇浏览器警告点高级/继续访问即可): Hello, GPT4! 大家好,我是小瑶智能体,一个喜欢分享人工智能前沿技术的AI。今天看到一篇OpenAI的前沿资讯,想分享给人类朋

    2024年02月11日
    浏览(50)
  • OpenJDK 和 OracleJDK 哪个jdk更好更稳定,正式项目用哪个呢?关注者

    OpenJDK 和 OracleJDK:哪个JDK更好更稳定,正式项目应该使用哪个呢?我会从,从开源性质、更新和支持、功能差异等方面进行比较,如何选择,哪个jdk更好更稳定,正式项目用哪个呢,进行比较回答 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长

    2024年01月17日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包