首页 > 其他分享 >go1.20最新版本变动更新

go1.20最新版本变动更新

时间:2022-11-20 11:46:35浏览次数:36  
标签:arr int fmt go1.20 更新 Println 版本 sl var

 

在Go 1.20版本之前,我们以Go 1.19版本[7]为例写下下面代码:

package main

import "fmt"

func main() {
    var sl = []int{1, 2, 3, 4, 5, 6, 7}
    var arr = [7]int(sl) // 编译器报错:cannot convert sl (variable of type []int) to type [7]int
    fmt.Println(sl)
    fmt.Println(arr)

在Go 1.20版本之前如果要实现切片到数组的转换,是有trick的,看下面代码:

func main() {
    var sl = []int{1, 2, 3, 4, 5, 6, 7}
    var parr = (*[7]int)(sl)
    var arr = *(*[7]int)(sl)
    fmt.Println(sl)  // [1 2 3 4 5 6 7]
    fmt.Println(arr) // [1 2 3 4 5 6 7]
    sl[0] = 11
    fmt.Println(sl)    // [11 2 3 4 5 6 7]
    fmt.Println(arr)   // [1 2 3 4 5 6 7]
    fmt.Println(*parr) // [11 2 3 4 5 6 7]
}

该trick的理论基础是Go允许获取切片的底层数组地址。在上面的例子中parr就是指向切片sl底层数组的指针,通过sl或parr对底层数组元素的修改都能在对方身上体现出来。但是arr则是底层数组的一个副本,后续通过sl对切片的修改或通过parr对底层数组的修改都不会影响arr,反之亦然。

 

该trick的理论基础是Go允许获取切片的底层数组地址。在上面的例子中parr就是指向切片sl底层数组的指针,通过sl或parr对底层数组元素的修改都能在对方身上体现出来。但是arr则是底层数组的一个副本,后续通过sl对切片的修改或通过parr对底层数组的修改都不会影响arr,反之亦然。

不过这种trick语法还不是那么直观!于是上面那个“允许将切片直接转换为数组”的issue便提了出来。我们在go playground[8]上选择“go dev branch”便可以使用最新go tip的代码,我们尝试一下最新语法:

func main() {
 var sl = []int{1, 2, 3, 4, 5, 6, 7}
 var arr = [7]int(sl)      
 var parr = (*[7]int)(sl)
 fmt.Println(sl)   // [1 2 3 4 5 6 7]
 fmt.Println(arr)  // [1 2 3 4 5 6 7]
 sl[0] = 11
 fmt.Println(arr)  // [1 2 3 4 5 6 7]
 fmt.Println(parr) // &[11 2 3 4 5 6 7]
}

我们看到直接将sl转换为数组arr不再报错,但其语义与前面的“var arr = ([7]int)(sl)”语义是相同的,即返回一个切片底层数组的副本,arr不会受到后续切片元素变化的影响。

不过这里也有个约束,那就是转换后的数组长度要小于等于切片长度,否则会panic:

var sl = []int{1, 2, 3, 4, 5, 6, 7}
var arr = [8]int(sl) // panic: runtime error: cannot convert slice with length 7 to array or pointer to array with length 8

在写本文时,该issue尚未close,不过进入最终Go 1.20版本应该不是大问题

标签:arr,int,fmt,go1.20,更新,Println,版本,sl,var
From: https://www.cnblogs.com/cheyunhua/p/16908121.html

相关文章

  • node-sass与node版本对照图
     长风破浪会有时,直挂云帆济沧海......
  • jar包版本
    α(Alpha) 此版本表示该软件仅仅是一个初步完成品,通常只在软件开发者内部交流,也有很少一部分发布给专业测试人员。一般而言,该版本软件的bug(漏洞)较多,普通用户最好不要安装。......
  • 【Excel~基础】解决msoffice高低版本兼容问题
    问题描述现今的office高版本可以兼容低版本文件,例如office2016可以兼容2010,甚至是2003版本的excel文件,但低版本却无法打开高版本的excel文件。例如Excel2016格式的数......
  • node 安装配置 及 cnpm 和node 版本不兼容问题
    新电脑回来安装node配置环境 node=>npm=>cnpm=>yarn=>淘宝镜像node下载安装, 一直next到安装成功。刚开始下的16.18的版本,起vue2项目因为node-sass版......
  • GIT版本管理工具教程
    一Git初始化下载安装,下载地址:https://git-scm.com/downloads每个系统的都有(linux、mac、windows等),看官网的安装教程,很详细,此处我以windows来练习首先创建一个文......
  • 基于Java 语言实现区块链的 Proof of Concept 版本
    基于Java语言实现区块链的ProofofConcept版本1.创建区块类/***区块链里边存放的数据是:*data数据*preHash上一个区块的hash值*hash自己的hash值它......
  • 操作系统期末复习[持续更新...]
    填空(20)+简答(40)+分析(20)+设计(20)第一章什么是操作系统操作系统是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充操作系统的目标方便性,有效性,可扩充性和开放性操......
  • Python冷知识:如何找出新版本增加或删除了哪些标准库?
    “内置电池”是Python最为显著的特性之一,它提供了200多个开箱即用的标准库。但是,历经了30多年的发展,很多标准库已经成为了不得不舍弃的历史包袱,因为它们正在“漏电”......
  • Mysql历史介绍及多版本安装
    目录一、数据库概述1.1什么是数据库1.2数据库的分类1.3Mysql企业版本选择二、Windows多版本部署Mysql数据库2.1mysql5.6版本安装2.2mysql5.7版本安装2.3mysql8.0版......
  • 使用yum查询系统安装的软件及可以更新的软件并单独指定升级某一个软件
    Linux系统下yum命令查看安装了哪些软件包: $yumlistinstalled//列出所有已安装的软件包 yum针对软件包操作常用命令: 1.使用YUM查找软件包 命令:yumsearchphp......