如何在 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
我有一些数据数组,我想将其映射到 []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