Go 将错误转换为映射或结构
刚从Go开始,目前正在尝试创建RESTAPI。使用Go 将错误转换为映射或结构,go,go-gorm,Go,Go Gorm,刚从Go开始,目前正在尝试创建RESTAPI。使用gorm和gin执行相同操作。当am被卡住时,我试图从错误对象中获取一个值,但无法直接执行该操作 如果我知道的没错,error类型只是有一个可用的error方法,它给出对象的消息部分中的任何内容。这是我的错误对象 { "Severity": "ERROR", "Code": "23505", "Message": "duplicate key value violates unique constraint \"uix_u
gorm
和gin
执行相同操作。当am被卡住时,我试图从错误
对象中获取一个值,但无法直接执行该操作
如果我知道的没错,error
类型只是有一个可用的error
方法,它给出对象的消息
部分中的任何内容。这是我的错误对象
{
"Severity": "ERROR",
"Code": "23505",
"Message": "duplicate key value violates unique constraint \"uix_users_email\"",
"Detail": "Key (email)=(johndoe@gmail.com) already exists.",
"Hint": "",
"Position": "",
"InternalPosition": "",
"InternalQuery": "",
"Where": "",
"Schema": "public",
"Table": "users",
"Column": "",
"DataTypeName": "",
"Constraint": "uix_users_email",
"File": "nbtinsert.c",
"Line": "433",
"Routine": "_bt_check_unique"
}
现在,我想做的是,访问Detail
键,我有点困惑。这就是我目前为实现这一目标所做的:
if err := a.DB.Create(&user).Error; err != nil {
val, _ := json.Marshal(err)
m := make(map[string]string)
json.Unmarshal(val, &m)
context.JSON(422, gin.H{"error": m["Detail"]})
return
}
但这似乎有点过分了。我必须Marshal
错误,然后Unmarshal
它到一个映射中&最后使用它
有更简单的方法吗?将其断言为
pq.Error
并访问以下字段:
.将其断言为
pq.Error
,并访问以下字段:
.它只是一个结构,请尝试访问字段。如果尝试,则会抛出错误。唯一可用的方法是
Error
什么类型的Error
?它在哪个包中定义?如果基础类型是由生成错误的包导出的,则可以使用类型断言。然后可以使用简单的类型断言将其强制为基础类型,然后访问字段。但是你仍然需要弄清楚实际的类型是什么,它是在什么包中定义的——“它是一个接口类型”并不能回答这些问题。它只是一个结构,请尝试访问字段。如果尝试了,就会抛出一个错误。唯一可用的方法是Error
什么类型的Error
?它在哪个包中定义?如果基础类型是由生成错误的包导出的,则可以使用类型断言。然后可以使用简单的类型断言将其强制为基础类型,然后访问字段。但是你仍然需要弄清楚实际的类型是什么,以及它在什么包中定义——“它是一个接口类型”并不能回答这些问题。当我显式导入github.com/lib/pq
包时,这是有效的。在gorm
包中导入相同的包作为副作用。相同的类型是否可以通过gorm
获得,或者我必须导入lib/pq
包?当我显式导入github.com/lib/pq
包时,这就起作用了。在gorm
包中导入相同的包作为副作用。通过gorm
是否可以使用相同类型,或者我必须导入lib/pq
包?
if err, ok := err.(*pq.Error); ok {
fmt.Println("pq error:", err.Code.Name())
// Or whatever other field(s) you need
}