go1.23.0 比较好用的特性

自定义遍历

在Go 1.23版本中,引入了新的迭代器语法,这为for-range循环带来了更大的灵活性和表达能力。此前,for-range循环主要用于遍历数组、切片、字符串、映射或通道等集合类型。然而,在Go 1.23中,你可以自定义任何序列的迭代器,并在for-range循环中使用它。
举个例子,假设你有一个表示树结构的类型,并且你想要遍历这棵树的所有节点。在Go 1.23之前,你可能需要编写一个递归函数或使用显式循环来实现这一点。但是,有了新的迭代器语法,你可以定义一个迭代器函数,然后在for-range循环中使用它,从而更简洁地遍历树的节点。
现在 for-range 循环中的 range 子句可以接受以下类型的迭代器函数作为 range 表达式:

func(func() bool)
func(func(K) bool)
func(func(K, V) bool)

下面是使用迭代器函数的简单示例:

package main

import "fmt"

// Backward 定义了一个倒序遍历字符串切片的迭代器函数
func Backward[E any](s []E) func(yield func(int, E) bool) {
	return func(yield func(int, E) bool) {
		for i := len(s) - 1; i >= 0; i-- {
			if !yield(i, s[i]) {
				return // 如果回调函数返回false,则停止迭代
			}
		}
	}
}

func main() {
	// 定义一个字符串切片
	s := []string{"hello", "world", "Go", "1.23"}

	// 使用Backward函数和显式的yield回调函数
	Backward(s)(func(i int, v string) bool {
		fmt.Println(i, v) // 同样按照倒序打印索引和值
		return true       // 继续迭代
	})

	//等同上面代码
	for i, v := range Backward(s) {
		fmt.Println(i, v) // 将按照倒序打印索引和值
	}
    // 注意:上面的for-range循环实际上会被编译器转换为对Backward(s)返回函数的调用,
	// 并且使用了一个内部的yield函数来处理迭代过程。但这一转换对开发者是透明的。
}

在这里插入图片描述

Golang-意外崩溃记录

runtime/debug

debug.SetCrashOutput 函数允许用户指定一个备用文件,运行时应该将其致命崩溃报告写入该文
件,这可用干为所有意外崩溃(而不仅仅是那些显式使用recover的goroutine中的崩溃)构建
自动报告机制。
SetCrashOutput配置一个未处理的附加文件除了标准错误外,还会打印恐慌和其他致命错误。
只有一个额外的文件:调用SetCrashOutput再次覆盖之前的电话。
SetCrashOutput复制了f的文件描述符,所以调用者可以安全地SetCrashOutput返回后立即关闭。
要禁用这个额外的崩溃输出,请调用SetCrashOutput(nil)。如果在崩溃时并发调用,可能会写入一些正在进行的输出即使在覆盖SetCrashOutput返回之后,也要将旧文件保存。

在这里插入图片描述

点赞 -收藏 -关注
有问题在评论区或者私信我-收到会在第一时间回复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡安民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值