当前位置: 首页 > news >正文

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]intarray2 := [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 []bytepbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) // 先引用,防止原有string gcpbytes.Data = stringHeader.Datapbytes.Len = stringHeader.Lenpbytes.Cap = stringHeader.Lenreturn 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

  • 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正式发布,更好更易更强

预期中的Go 2不会有了&#xff0c;1.20也算是一个小gap&#xff0c;从中可以一窥Go未来的发展之路。对于Go来说&#xff0c;未来保持1.x持续演进和兼容性之外&#xff0c;重点就是让Go性能更优&#xff0c;同时保持大道至简原则&#xff0c;使用尽可能容易&#xff0c;从这两个…...

图片显示一半怎么回事?

不知道小伙伴是否遇到过&#xff0c;刚刚上传的一个文件夹&#xff0c;有一多半的图片突然就变成了无法显示该图片或者是图片显示一半&#xff0c;而另外一半就显示灰色蓝色粉色条状。而且还把原文件删除了。面对这种情况&#xff0c;有什么解决方法呢?下面让我们一起来来看看…...

102-并发编程详解(中篇)

这里续写上一章博客 Phaser新特性 &#xff1a; 特性1&#xff1a;动态调整线程个数 CyclicBarrier 所要同步的线程个数是在构造方法中指定的&#xff0c;之后不能更改&#xff0c;而 Phaser 可以在运行期间动态地 调整要同步的线程个数&#xff0c;Phaser 提供了下面这些方…...

jsp羽毛球场馆管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 羽毛球场馆管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;…...

CacheLib 原理说明

CacheLib 介绍 CacheLib 是 facebook 开源的一个用于访问和管理缓存数据的 C 库。它是一个线程安全的 API&#xff0c;使开发人员能够构建和自定义可扩展的并发缓存。 主要功能&#xff1a; 实现了针对 DRAM 和 NVM 的混合缓存&#xff0c;可以将从 DRAM 驱逐的缓存数据持久…...

【dapr】服务调用(Service Invokation) - app id的解析

逻辑图解 上图来自Dapr官网教程&#xff0c;其中Checkout是一个服务&#xff0c;负责生成订单号&#xff0c; Order Processor是另一个服务&#xff0c;负责处理订单。Checkout服务需要调用Order Processor的API&#xff0c; 让Order Processor获取到其生成的订单号并进行处理。…...

Odoo丨5步轻松实现在Odoo中打开企微会话框

Odoo丨5步轻松实现在Odoo中打开企微会话框 在Odoo中开启企微会话框 企业微信作为一个很好的企业级应用发布平台&#xff0c;尤其是提供的数据和接口&#xff0c;极大地为很多企业级应用提供便利&#xff0c;在日常中应用广泛&#xff01; 最近在项目中就遇到一个与企业微信相…...

python读取.stl文件

目录 .1 文本方式读取 1.2 stl解析 1.3 stl创建 .2 把点转换为.stl .1 文本方式读取 代码如下 stl_path/home/pxing/codes/point_improve/data/003_cracker_box/0.stlpoints[] f open(stl_path) lines f.readlines() prefixvertex num3 for line in lines:#print (l…...

vue2.0项目第一部分

论坛项目后端管理系统服务器地址&#xff1a;http://172.16.11.18:9090swagger地址&#xff1a;http://172.16.11.18:9090/doc.html前端h5地址&#xff1a;http://172.16.11.18:9099/h5/#/前端管理系统地址&#xff1a;http://172.16.11.18:9099/admin/#/搭建项目vue create . …...

锁与原子操作

锁与原子操作 锁 以自增操作为例子&#xff1a; void *func(void *arg) {int *pcount (int *)arg;int i 0;//while (i < 100000) {(*pcount) ; // 并不会到达100000usleep(1);} }int main(){int i 0;for (i 0;i < THREAD_COUNT;i ) {pthread_create(&thid…...

Prometheus Pushgetway讲解与实战操作

目录 一、概述 1、Pushgateway优点: 2、Pushgateway缺点: 二、Pushgateway 架构 三、实战操作演示...

常见字符串函数的使用,你确定不进来看看吗?

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;C语言航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&a…...

Elasticsearch:在搜索中使用衰减函数(Gauss)

在我之前的文章 “Elasticsearch&#xff1a;使用 function_score 及 script_score 定制搜索结果的分数” 我有讲到 Decay 函数在搜索中的使用。在那里&#xff0c;我有一个例子讲述在规定的时间里&#xff0c;分数不进行衰减。同一的函数也可以适用于地理位置的搜索。位置搜索…...

微信小程序 Springboot英语在线学习助手系统 uniapp

四六级助手系统用户端是基于微信小程序端&#xff0c;管理员端是基于web端&#xff0c;本系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;idea开发工具&#xff0c; 系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆小程序&#xff0c;查看英语四六级…...

LeetCode算法题解——双指针2

LeetCode算法题解——双指针2第五题思路代码第六题思路代码第七题思路代码这里介绍双指针在数组中的第二类题型&#xff1a;两端夹击。 第五题 977. 有序数组的平方 题目描述&#xff1a; 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的…...

线性杂双功能peg化试剂——HS-PEG-COOH,Thiol-PEG-Acid

英文名称&#xff1a;HS-PEG-COOH&#xff0c;Thiol-PEG-Acid 中文名称&#xff1a;巯基-聚乙二醇-羧基 HS-PEG-COOH是一种含有硫醇和羧酸的线性杂双功能聚乙二醇化试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。巯基或SH、巯基或巯基选择性地与马来酰亚胺、OPSS、…...

Linux第三讲

目录 三、 磁盘和文件管理和使用检测和维护 3.1 磁盘目录 3.2 安装软件 3.2.1 rpm命令 3.2.2 克隆虚拟机 3.2.3 yum或压缩包方式安装jdk 3.2.4 使用虚拟机运行SpringBoot项目 3.2.5 安装mysql80&#xff08;57&#xff09; 3.2.6 运行web项目 3.2.7 安装tomcat 三、 …...

SpringBoot07:SpringSecurity

Security是什么&#xff1f; 是一个安全框架。可以用来做认证和授权 官网&#xff1a;Spring Security SpringSecurity环境搭建 1、创建一个新的project 2、导入thymeleaf依赖 <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf…...

C++ 浅谈之 STL Vector

C 浅谈之 STL Vector HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是 C 浅谈系列&#xff0c;收录在专栏 C 语言中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些 C 语言重要的语法特性 &#x1f3c3;&…...

【个人作品】非侵入式智能开关

一、产品简介 一款可以通过网络实现语音、APP、小程序控制&#xff0c;实现模拟手动操作各种开关的非侵入式智能开关作品。 非侵入式&#xff0c;指的是不需要对现有的电路和开关做任何改动&#xff0c;只需要将此设备使用魔术无痕胶带固定在旁边即可。 以下为 ABS 材质的渲…...

数据存储技术复习(三)未完

module4智能存储系统是功能丰富且可提供高度优化的I/o处理能力的RAID阵列。请绘制智能存储系统架构&#xff0c;并说明其各个关键组件的主要功能。前端缓存后端物理磁盘2&#xff0e;智能存储系统中&#xff0c;使用缓存进行的写入操作与直接写入到磁盘相比&#xff0c;可以带来…...

ThinkPHP数据库迁移工具

安装 composer require topthink/think-migration 创建迁移工具文件 //执行命令,创建一个操作文件,一定要用大驼峰写法,如下 php think migrate:create AnyClassNameYouWant //执行完成后,会在项目根目录多一个database目录,这里面存放类库操作文件 //文件名类似/database/m…...

代理模式(Proxy Pattern)

代理模式定义&#xff1a; 提供了对目标对象另外的访问方式&#xff1b;即通过代理对象访问目标对象。举个例子&#xff1a;猪八戒去找高翠兰结果是孙悟空变的&#xff0c;可以这样理解&#xff1a;把高翠兰的外貌抽象出来&#xff0c;高翠兰和孙悟空都实现了这个接口&#xff…...

Elasticesearch内存详解

1.ES基本概念 为了更好的理解内存,我们先看一下ES的基本概念。 1.1 cluster 集群 多个节点组合在一起就形成了一个集群,在每个ES节点中,我们可以通过配置集群的名称来使各个节点组合在一起,成为一个集群。当某些节点的集群名称一样,ES会自动根据配置文件中的地址找到这些…...

SpringCloud之断路器聚合监控

一、Hystrix Turbine简介 看单个的Hystrix Dashboard的数据并没有什么多大的价值&#xff0c;要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbine。Hystrix Turbine将每个服务Hystrix Dashboard数据进行了整合。Hystrix Turbine的使用非常简单&#xff0c;只需要…...

凭借这份《2022测试八股文》候选者逆袭面试官,offer拿到手软

《2023测试面试八股文》800 道软件测试面试真题&#xff0c;高清打印版打包带走&#xff0c;横扫软件测试面试高频问题&#xff0c;涵盖测试理论、Linux、MySQL、Web 测试、接口测试、App 测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑思维…...

【i2c协议介绍】

文章目录协议简单介绍五种速度模式master/slave和transmitter/receiver关系第一种情况&#xff1a;master作为transmitter&#xff0c;slave作为receiver第二种情况&#xff1a;当master作为receiver&#xff0c;slave作为transmitteri2c基本信号start产生stop信号数据传输有效…...

167. 两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 < numbers…...

编译与链接------《程序员的自我修养》

本篇整理于《程序员的自我修养》一书中编译与链接相关知识&#xff0c;整理的目的是为了更加深入的了解编译于链接的更多底层知识&#xff0c;面对程序运行时种种性能瓶颈我们束手无策。我们看到的是这些问题的现象,但是却很难看清本质&#xff0c;所有这些问题的本质就是软件运…...

5分钟搞懂 强缓存与协商缓存

Ⅰ、http缓存 HTTP 缓存策略 分为 > 「强制缓存」 和 「协商缓存」 为什么需要 HTTP 缓存 呢 ? &#x1f447; 直接使用缓存速度 >> 远比重新请求快 缓存对象有那些呢 &#xff1f;&#x1f447; 「图片」 「JS文件」 「CSS文件」 等等 文章目录Ⅰ、http缓存Ⅱ…...

广州 企业网站建设/互联网营销方案策划

在给定的网格中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;任何与腐烂的橘子&#xff08;在 4 个正方向上&#xff09;相邻的新鲜橘子都会腐烂。 返回直…...

宜春网站建设哪家专业/义乌最好的电商培训学校

原文地址&#xff1a;http://www.tuicool.com/articles/MzeM7r 本博文少许理论资料来至DBA技术大牛 http://blog.csdn.net/tianlesoftware/article/details/4717318 &#xff0c;本着实践式学习&#xff0c;书写以下博文&#xff1a; 一、什么是分区表 Oracle提供了分区技…...

深圳 营销型网站公司/青岛seo公司

第一周&#xff1a;做点计算1.1 第一个程序Eclipse是绝大多数人的唯一选择&#xff1b;如何在Eclipse中编辑、编译和运行程序&#xff1b;详解第一个程序&#xff1a;程序框架、输出、出错怎么办&#xff1b;做点计算&#xff1a;如何让程序输出算术结果1.2 数据是用变量来表示…...

买模板做网站/百度网站大全首页

这问题我会先自我介绍一下,我是十五年工作经验的程序员,但很不好意思,今年(2020年)二月份才接触linux,到现在为止(2020年11月),已经在公司内部的布署了多套linux下的应用与解决方案,并负责这些服务器的运维,我觉得我有资格回答你的问题.以下是我的回答:1.安装linux,不推荐使用虚…...

建设工程中标查询网站/京津冀协同发展

只是公益&#xff0c;希望能帮助所有参加考试和热爱数学的孩子们&#xff01;题目搜自网络&#xff0c;可能有误&#xff0c;题型思路更重要&#xff0c;谁有真题可以发给我&#xff0c;大家一起研究。答案解析只是一家之言&#xff0c;方法和打字可能有错误之处&#xff0c;一…...

网站界面用什么做/店铺seo是什么意思

关于eclipse安装可视化工具插件 百度搜索&#xff1a;windowbuilder 进入官网 点入下载界面 找到自己相对应的版本 点解link进入界面&#xff1a;复制网址即可 打开eclipse软件&#xff1a;点解帮助&#xff0c;进入安装插件界面 最后等待即可 转载于:https://www.cnblogs.com/…...