首页 > 其他分享 >go1.22的一些关键改动

go1.22的一些关键改动

时间:2024-02-18 15:33:19浏览次数:28  
标签:改动 Notice 惰性 values go1.22 func go done 关键

参考汇总文章

Go1.22 正式发布!包含语言变化、性能提高、标准库变动等重要特性

在电脑中安装多个版本的golang

由于我的电脑安装的是go的1.21版本,1.22版本改动很大,如果工作中部署的项目dockerFile中指定的镜像的go版本比1.22低的话,有一些语法会编译不通过,所以我在官方下载了.gz格式的go,然后解压到本地,再使用alias命令做了一个简单的别名,简单的演示一下go1.22的改动即可。

至于工作中是否有必要将go的版本升级到最新的1.22需要跟公司的同事一起商量。

golang所有镜像的地址

GoLang下载与安装-三种安装方式

语言层面解决“惰性计算”问题

go1.21及之前版本遇到的并发情况下的“惰性计算“问题及解决方案

package main

import (
    "fmt"
    "testing"
)

// 有惰性计算问题
func TestT1(t *testing.T) {
    done := make(chan bool)

    values := []string{"a", "b", "c"}
    for _, v := range values {
        go func() {
            // Notice 使用go1.21编译 有惰性计算问题 打印:
            /*
                v:  c
                v:  c
                v:  c
            */
            fmt.Println("v: ", v)
            done <- true
        }()
    }

    // wait for all goroutines to complete before exiting
    for _ = range values {
        <-done
    }
}

// 解决方案1
func TestT2(t *testing.T) {
    done := make(chan bool)

    values := []string{"a", "b", "c"}

    for _, v := range values { // Notice 每次for循环 不会为v新申请内存

        // Notice 使用go1.21编译 有惰性计算问题 这样解决:
        // 在for循环中使用一个临时变量接收v,相当于重新申请一块内存
        currV := v

        go func() {
            /*
                v:  c
                v:  b
                v:  a
            */
            fmt.Println("v: ", currV)
            done <- true
        }()
    }

    // wait for all goroutines to complete before exiting
    for _ = range values {
        <-done
    }
}

// 解决方案2
func TestT3(t *testing.T) {
    done := make(chan bool)

    values := []string{"a", "b", "c"}

    for _, v := range values { // Notice 每次for循环 不会为v新申请内存

        // Notice 使用go1.21编译 有惰性计算问题 这样解决:
        // 将v当作参数传到子协程这个匿名函数中
        go func(currV string) {
            /*
                v:  c
                v:  a
                v:  b
            */
            fmt.Println("v: ", currV)
            done <- true
        }(v)
    }

    // wait for all goroutines to complete before exiting
    for _ = range values {
        <-done
    }
}

go1.22从语言层面解决了“惰性计算”问题

注意:下面的代码需要使用go1.22的编译器才能出来效果:

package main

import "fmt"

func main() {
    done := make(chan bool)

    values := []string{"a", "b", "c"}
    for _, v := range values { // Notice 每次for循环都会为v重新申请一块内存
        go func() {
            // Notice 使用go1.22编译 解决了惰性计算问题 打印:
            /*
                    v:  b    v的地址:  0xc000090030
                    v:  a    v的地址:  0xc000090020
                    v:  c    v的地址:  0xc000090040
            */
            fmt.Println("v: ", v, "   v的地址: ", &v)
            done <- true
        }()
    }

    // wait for all goroutines to complete before exiting
    for _ = range values {
        <-done
    }
}

 

 

123

123

clear函数的坑

clear函数是

123

123

标签:改动,Notice,惰性,values,go1.22,func,go,done,关键
From: https://www.cnblogs.com/paulwhw/p/18019377

相关文章

  • 分布式系统---关键技术“消息中间件”
    消息中间件是一种用于构建分布式系统的软件基础设施,提供了一种异步的,可靠的,可伸缩的消息传递机制。 提高系统性能首先考虑的是数据库的优化,但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所有我们一般会尽量把流量都挡在数据库之前。不管是无限的横向扩展服务器,还是纵向......
  • 机器视觉在缺陷检测中的关键作用:提升检测精度与效率
    机器视觉在缺陷检测中起着至关重要的作用,它通过图像处理和模式识别技术,实现了对产品质量的自动、高效和精确检测。以下是机器视觉在缺陷检测中的关键作用:提升检测精度:机器视觉系统可以对产品进行高精度的检测,能够发现微小的缺陷。通过深度学习和人工智能的融合,机器视觉技术能够......
  • 领导力提升,才是高绩效的关键
    作为企业的CEO或团队管理者,在日常的团队管理工作中无论是领导力还是执行力,都是非常重要的。在领导力的提升方面,我们可以通过一整套方案来进行,包括如何设定目标,动机刺激、任务拆解、鼓励参与、责任承担、建立制度、建立文化、培养和提升员工及团队综合能力等等。找到团队核心目标......
  • JavaSE的第二步 —— 注释、标识符、关键字
    一、注释每个人的编写代码的的习惯和理解都不一样,那么每一个需要完成的代码需求在个人写出来之后都是不一样的很多时候,我今天写的东西在未来的某天看来有较大的概率是不认识的,这与代码的复杂度有关。在Java中提供了注释这一功能,帮助我们对自己所编写代码进行标注,便于代码的维护......
  • 机器视觉技术:提升安全与效率的关键
    机器视觉技术:提升安全与效率的关键随着技术的不断发展,机器视觉技术已经成为提高许多行业安全与效率的关键要素。无论是在工业制造、交通监控、安全防卫,还是在医疗诊断、零售管理等领域,机器视觉技术都发挥着越来越重要的作用。一、提高安全水平机器视觉技术在安全监控领域的应用......
  • 汉字拼音桥接交流与传承的关键
    汉字拼音,一种基于拉丁字母为汉字标注读音的发音指导系统,自20世纪50年代推广以来便成为学习汉语的基石。这种独特的拼写系统不仅在汉语的教育与学习领域起到不可替代的作用,而且对文化的传承、科技的进步以及国际交流都产生了深远的影响。汉字拼音|一个覆盖广泛主题工具的......
  • C++中的static关键字和this指针
    C++中的static关键字用来修饰静态成员变量和静态成员函数,static定义的类的静态成员(成员变量和成员函数),它会有一块单独的存储区。当我们把这个类实例化时,会为类实例化的对象来分配空间,显然此时给对象分配的内存空间不包括静态成员所占的空间。特别要注意,静态成员变量必须在类......
  • 陪护系统|陪护小程序提升长者护理服务质量的关键
    在如今逐渐老龄化的社会中,老年人对更好的护理服务需求不断增加。科技的进步使得陪护小程序系统源码成为提供优质服务的重要途径之一。本文将从运营角度探讨如何优化陪护小程序系统源码,提升长者护理服务的质量。 首先,我们需要对软件的设计和用户体验进行全面优化。陪护小程序系统源......
  • linux 搜索zip压缩文件内的关键字
    有这样一个场景,一个应用有日志归档,每天新建一个文件夹文件夹里是zip压缩文件             这时候如果程序出现问题,但是不确定是哪一天,需要搜索这些天里的日志文件关键字,这个怎么弄问题比较棘手,经过一番琢磨还是解决了:zgrep'deletefromt_common......
  • 问题:糖原合成的关键酶是(),糖原分解的关键酶是()
    问题:糖原合成的关键酶是(),糖原分解的关键酶是()参考答案如图所示......