최근 Go1.20이 2월 초에 정식 출시되었습니다. 예전에는 이달 말까지 미뤄졌었는데, 결국엔 아직까지 만들었습니다. 많은 기능 절충안이 있었고 일부 새로운 기능(예: 경기장 등)이 포함된 특정 기능을 출시해야 했습니다.
바둑팀은 2월에 무슨 일이 있는지, 아니면 휴가를 갈 예정인지 궁금합니다. 아니면 정리해고가 업무 인계에 영향을 미칠까 봐 걱정되시나요?
오늘은 우리에게 더 관련성이 높은 새로운 기능을 빠르게 검토하고 1.20으로 업그레이드할 수 있는지 알아보겠습니다.
Go1.18이 제네릭을 정식 출시하기 전에는 기쁨과 걱정도 있었습니다. 이는 제네릭을 지원하지만 Go1.18의 컴파일 속도는 Go1.17의 컴파일 속도보다 약 15~18% 느려 상당히 느려집니다.
일반 기능으로 인해 Go가 자랑하는 빌드 속도가 느려졌습니다. 나중에 커피를 만들지 않으면 커피를 만들 수 있을까 두려우신가요?
원래 Go1.19에서 수정된다고 했었는데 빠졌네요. 마지막으로 현재 버전이 수정되었습니다.
다음 테스트 보고서:
│ 117.results │ 118.results │ 119.results │ tip.results │ │ sec/op │ sec/op vs base │ sec/op vs base │ sec/op vs base │ GoBuildKubelet 52.58 ± 0% 56.54 ± 1% +7.54% (p=0.000 n=10) 55.47 ± 1% +5.50% (p=0.000 n=10) 51.41 ± 1% -2.22% (p=0.000 n=10) GoBuildIstioctl 47.78 ± 1% 51.44 ± 0% +7.65% (p=0.000 n=10) 50.89 ± 5% +6.50% (p=0.000 n=10) 46.05 ± 1% -3.62% (p=0.000 n=10) GoBuildFrontend 19.03 ± 1% 20.55 ± 1% +7.99% (p=0.000 n=10) 20.04 ± 0% +5.33% (p=0.000 n=10) 18.22 ± 1% -4.27% (p=0.000 n=10) geomean 36.29 39.10 +7.72% 38.39 +5.77% 35.07 -3.37%
최신 Go1.20 벤치마크 테스트에서 현재 버전과 Go1.17의 빌드 속도는 일관되게 유지되었습니다.
또한 컴파일러와 가비지 수집기가 최적화되어 메모리 오버헤드가 줄어들고 전체 CPU 성능이 2% 향상됩니다.
Go1.20 업데이트 발표에서는 macOS 및 Windows 운영 체제와 관련된 주요 업데이트 종료 알림도 발표했습니다.
은 다음과 같습니다.
Go1.20은 macOS 10.13 High Sierra 또는 10.14 Mojave에서의 실행을 지원하는 마지막 버전입니다. Go 1.21에는 macOS 10.15 Catalina 이상이 필요합니다.
Go1.20은 Windows 7, 8, Server 2008 및 Server 2012의 모든 버전에서 실행을 지원하는 마지막 버전입니다. Go 1.21에는 Windows 10 또는 Server 2016 이상이 필요합니다.
안녕하세요, 운영 체제 버전을 업데이트해야 할 것 같습니다. 그렇지 않으면 Go의 다음 버전에서 코딩을 할 수 없을 것입니다.
有需要的同学在下个版本前尽早做好升级。
新版本起,Go 的 $GOROOT/pkg
目录将不再存储标准库的预编译包存档,Go 发行版的将迎来一轮瘦身。
大小对比如下。
Go1.20:
Go1.19:
约比老版本缩减了 1/3,还是比较明显的。
在 Go1.20 起,Go 引入了 Profile-guided optimization (PGO),翻译过来是使用配置文件引导的优化,当前为预览版本。
PGO 是一门编译器优化技术,能够在不改业务代码的情况下,给你的应用程序带来一定的性能提升。在 Go PGO 中将会依托 runtime/pprof 所生成的 profile 来完成。
结果上可以使得 Go tool(工具链)能根据运行时信息执行特定于应用程序和工作负载的优化。说明了就是想提高性能,不需要改业务代码。
具体可以详见:《PGO 是啥,咋就让 Go 更快更猛了?》
在原有 Go1.13 的 errors API 上进行新增和修改,核心是支持一个错误可以封装多个错误的特性。
新特性例子:
func main() { err1 := errors.New("err1") err2 := errors.New("err2") err := errors.Join(err1, err2) fmt.Println(err) if errors.Is(err, err1) { fmt.Println("err is err1") } if errors.Is(err, err2) { fmt.Println("err is err2") } }
输出结果:
err1 err2 err is err1 err is err2
具体可以详见:《Go1.20 继续小修小补 errors 库。。。》
Go 团队通过分析、搜索发现 reflect.SliceHeader 和 reflect.StringHeader:
type StringHeader struct { Data uintptr Len int }
在业内经常被滥用,使用不方便,很容易出现隐性问题。例如:Data 字段类型是 uintptr 不是 unsafe.Pointer。设什么都可以,灵活度过于高,非常容易搞出问题。
在 Go1.20 起,在 unsafe 标准库新增了 3 个函数来替代前面这两个类型的使用。希望能够进一步标准化,并提供额外的类型安全。
如下函数签名:
func String(ptr *byte, len IntegerType) string
:根据数据指针和字符长度构造一个新的 string。func StringData(str string) *byte
:返回指向该 string 的字节数组的数据指针。func SliceData(slice []ArbitraryType) *ArbitraryType
:返回该 slice 的数据指针。新版本的用法变成:
func StringToBytes(s string) []byte { return unsafe.Slice(unsafe.StringData(s), len(s)) } func BytesToString(b []byte) string { return unsafe.String(&b[0], len(b)) }
以往常用的 reflect.SliceHeader
和 reflect.StringHeader
将会被标注为被废弃。
具体可以详见:《别乱用了,用新的。Go SliceHeader 和 StringHeader 将会被废弃!》
有很多 Go 同学反馈老要记 2006-01-02 15:04:05,发现这个日期时间点,使用的次数非常高频:
Ranking | Frequency | Format |
---|---|---|
1 | 75616 | time.RFC3339 |
2 | 239 54 | time.RFC3339Nano |
3 | 13312 | "2006-01-02 15:04:05" |
4 | 12332 | "2006-01-02" |
5 | 11940 | time.RFC1123 |
使用频率的数据有理有据。
Go1.20 加了以下常量,便于直接引用:
DateTime = "2006-01-02 15:04:05" DateOnly = "2006-01-02" TimeOnly = "15:04:05"
再者就是新增了时间比较的方法。
在现在的标准库中,有 3 个方法来比较 time.Time 对象,分别是:Before()、Equal() 和 After(),作用上类似 <、== 和 >。但缺少 <= 和 >= 的等价物。
Go1.20 将会支持 Time.Compare,以此来达到类似的效果。作用是将 Time 对象 t 和 u 两者进行比较。
func (t Time) Compare(u Time) int
该方法返回如下几种结果:
具体可以详见:《Go1.20 中两个关于 Time 的更新,终于不用背 2006-01-02 15:04:05 了!》
以前可以做匿名接口循环导入的骚操作。如下代码:
type I interface { m() interface { I } }
这段代码,声明了接口类型 I,然后又包含了 m(),又包含接口 I。这会是一个 “永动机”,永远都不会停止。在开源的 GitHub 中,也真实存在着。
Go1.20 起,编译器将会默认拒绝匿名接口循环导入。如果没有用户反馈受到了重大的影响或问题,将会计划在 Go1.22 中正式的禁用和移除该项功能的支持。
具体可以详见:《Go1.20 将禁止匿名接口循环导入!》
Go1.20 将会在没有 C 工具链的系统上默认禁用 CGO。这理论上是一个不兼容性设置,如果大家有需要,可以提前设置好 CGO_ENABLED 环境变量,以避免导致部分应用程序出问题。
Go1.20 起支持将切片转换成数组。
如下代码:
func main() { v := []string{"煎", "鱼", "进", "脑", "子", "了"} s := [6]string(v) fmt.Println(s) }
当然,前提是切片和数字的长度和类型都要对的上。否则会出现如下报错:
panic: runtime error: cannot convert slice with length 5 to array or pointer to array with length 6 goroutine 1 [running]: main.main() /tmp/sandbox1162344488/prog.go:9 +0x1d Program exited.
在本次 Go1.20 的更新中,比较有意思的是 PGO 的预览版本,大家有机会可以体验下不改代码就提高应用性能的快感。而相关的更新有的是在偿还技术债务。例如:编译加速等。
원래 많은 관심을 받았던 아레나는 앞서 "뺨때리기 형제들, Go1.20 아레나가 왔어요!"에 소개된 바 있습니다. 에서 공유했습니다. Go 팀은 구체적인 구현과 분석을 거쳐 기존 API에 심각한 문제가 있음을 발견하고 반복 코드를 일시적으로 롤백하여 포기했습니다. 이 내용은 나중에 따로 공유할 생각입니다.
Go1.21부터 일부 macOS 및 Windows 버전은 더 이상 지원되지 않는다는 점에 유의하는 것이 특히 중요합니다. 일부 회사의 기계나 심지어 귀하의 기계도 미리 업그레이드해야 할 수도 있습니다
위 내용은 Go1.20: PGO, 컴파일 속도, 오류 처리 및 기타 새로운 기능에 대해 무엇을 알고 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!