参考汇总文章
Go1.22 正式发布!包含语言变化、性能提高、标准库变动等重要特性
在电脑中安装多个版本的golang
由于我的电脑安装的是go的1.21版本,1.22版本改动很大,如果工作中部署的项目dockerFile中指定的镜像的go版本比1.22低的话,有一些语法会编译不通过,所以我在官方下载了.gz格式的go,然后解压到本地,再使用alias命令做了一个简单的别名,简单的演示一下go1.22的改动即可。
至于工作中是否有必要将go的版本升级到最新的1.22需要跟公司的同事一起商量。
语言层面解决“惰性计算”问题
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