自定义遍历
在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返回之后,也要将旧文件保存。

822

被折叠的 条评论
为什么被折叠?



