Go 将错误转换为映射或结构

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

刚从Go开始,目前正在尝试创建RESTAPI。使用
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
}