Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用panic/recover作为测试成功的类型断言的手段可以吗?_Json_Go_Recover_Panic_Type Assertion - Fatal编程技术网

Json 使用panic/recover作为测试成功的类型断言的手段可以吗?

Json 使用panic/recover作为测试成功的类型断言的手段可以吗?,json,go,recover,panic,type-assertion,Json,Go,Recover,Panic,Type Assertion,我一直在研究一种方法,试图通过嵌套的JSON响应进行解析,而无需将信息映射到预定义的结构 通过一个空白界面,它返回为: map[name:My Folder parentId:1 created:2014-10-09T16:32:07+0000 deleted:false description:Sync Dir id:3 links:[map[rel:self entity:folder href:https://web.domain.org/rest/folders/3 id:3] map[

我一直在研究一种方法,试图通过嵌套的JSON响应进行解析,而无需将信息映射到预定义的结构

通过一个空白界面,它返回为:

map[name:My Folder parentId:1 created:2014-10-09T16:32:07+0000 deleted:false description:Sync Dir id:3 links:[map[rel:self entity:folder href:https://web.domain.org/rest/folders/3 id:3] map[href:https://web.domain.org/rest/folders/1 id:1 rel:parent entity:folder] map[entity:user href:https://web.domain.org/rest/users/1 id:1 rel:creator]] modified:2014-12-18T18:07:01+0000 permalink:https://web.domain.org/w/SpJYGQkv syncable:true type:d userId:1] 这是一种可以接受的从JSON字符串解析信息的方法,还是有更可取的方法

下面是使用上述方法解析出我当前使用的正确信息的示例:

func mapCache(input map[string]interface{}, valType string) {
    fmt.Println(input)
    var (
        name string
        href string
        rel string
        links []interface{}
        myMap map[string]interface{}
    )

    if name = NString(NFind(input, "name")); name == "" { return }
    if links = NArray(NFind(input, "links")); links == nil { return }

    for i := 0; i < len(links); i++ {
        if myMap = NMap(links[i]); myMap == nil { return }
        if rel = NString(myMap["rel"]); rel == "" { return }
        if rel == "self" {
            if href = NString(myMap["href"]); href == "" { return }
        }
    }
    CacheDB.Set(valType, name, href, false)
}
func-mapCache(输入映射[string]接口{},valType字符串){
fmt.Println(输入)
变量(
名称字符串
href字符串
rel字符串
链接[]接口{}
myMap映射[字符串]接口{}
)
如果name=NString(NFind(输入,“name”);name==”{return}
如果links=NArray(NFind(输入,“links”);links==nil{return}
对于i:=0;i
如有任何见解,将不胜感激!谢谢

检查:

在特殊形式的赋值或初始化中使用的类型断言

v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)
生成一个额外的非类型化布尔值。如果断言成立,则ok的值为true。否则为false,v的值为类型T的零值。在这种情况下不会发生运行时死机

与使用错误处理来检查类型相比,这种方法速度更快,黑客性更少

所以你可以重写

func NMap(input interface{}) map[string]interface{} {
    defer func() {if r := recover(); r != nil {}}()
    if input == nil { return nil }
    return input.(map[string]interface{})
}
作为

你也可以考虑一个库,比如使<代码> MAP[String ]接口{} /Cult>更容易处理。当然,也可以试着找出

编码/json
现有模式中的一种如何做到这一点

func NMap(input interface{}) map[string]interface{} {
    defer func() {if r := recover(); r != nil {}}()
    if input == nil { return nil }
    return input.(map[string]interface{})
}
func NMap(input interface{}) map[string]interface{} {
    if m, ok := input.(map[string]interface{}); ok {
        return m
    }
    return nil
}