如何在 golang 中记录类型断言错误?

How to log type assertion errors in golang?

我有一些数据数组,我想将其映射到 []string。我可以通过两种方式做到这一点:

一)

// someData
s := someData.([]string)

在这种情况下,执行将在控制台列出错误后停止。

b)

// someData
s, ok := someData.([]string)

在这种情况下,不会发生错误,但 s 将具有其零值


我想在不停止执行的情况下记录此类类型断言失败案例中的错误。但是,当我使用类型 (b) 时,我看不到错误详细信息。

我能想到的唯一解决方案是使用 reflect.TypeOf 并打印这两种类型。

在使用解决方案 (b) 时,有没有其他方法可以解决错误?

您可以自己构造日志消息。不需要显式调用 reflect,因为有一个 printf 格式字符串 %T 可以生成类型。

s, ok := someData.([]string)
if !ok {
    log.Printf("got data of type %T but wanted []string", someData)
    ... handle the failure somehow
}

在不了解上下文的情况下,我很难生成有用的信息性日志语句,但您可以根据自己的用例调整想法。

好吧,根据您想如何进行类型断言,有一种方法可以在情况 a) 和情况 b) 中得到错误。

所以,我将首先介绍 b,因为 if 是最直接的:您可以使用 %T 来获取元素的类型:

func typeAssert(i interface{}) []string {
    s, ok := i.([]string)
    if !ok {
        fmt.Printf("interface conversion: interface is %T, not []string\n", i)
    }
    return s
}

另一种方法涉及从错误中恢复,因此您可以将恐慌消息作为错误获取:

func assertType(i interface{}) []string {

    // Recover
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()

    return i.([]string)
}

func main() {
    assertType([]int{42})

    fmt.Println("Recovered from the error")
}
// OUTPUT:
// interface conversion: interface is []int, not []string
// Recovered from the error

当然,您可以根据自己的需要添加自己的错误处理方式。第一个解决方案无论如何都允许更大的灵活性,但 recover 有时可能很方便(在这种情况下不一定)。

这里是 link 到 Go playground