如何将接口转换为自定义类型

cookieisaac:

我正在尝试从json字符串中解析出特定字段,目前我有以下代码段。

package main

import (
    "encoding/json"
    "fmt"
)

type PlatformID string

type Map map[string]interface{}

func Str2Map(str string) (Map, error) {
    var dictionary Map
    bytes := []byte(str)
    err := json.Unmarshal(bytes, &dictionary)
    if err != nil {
        fmt.Println(err)
    }
    return dictionary, err
}

func parsePlatformID(str string) (PlatformID, error) {
    fmt.Println(str)
    dict, err := Str2Map(str)
    fmt.Println(dict)
    return dict["platform-id"].(PlatformID), err
}

func main() {
    PlatformDictStr := "{\"platform-id\":\"platform_BnjliXLEUV26\",\"platform-labels\":\"test\",\"OptimizeScheme\":\"None\"}"

    fmt.Println(PlatformDictStr)

    ID, _ := parsePlatformID(PlatformDictStr)
    fmt.Println(ID)
}

当我尝试运行它时,它给了我以下错误

{"platform-id":"platform_BnjliXLEUV26","platform-labels":"test","OptimizeScheme":"None"}
{"platform-id":"platform_BnjliXLEUV26","platform-labels":"test","OptimizeScheme":"None"}
map[platform-id:platform_BnjliXLEUV26 platform-labels:test OptimizeScheme:None]
panic: interface conversion: interface is string, not main.PlatformID

goroutine 1 [running]:
panic(0x126aa0, 0x10532300)
    /usr/local/go/src/runtime/panic.go:500 +0x720
main.parsePlatformID(0x13e6fe, 0x58, 0x0, 0x0, 0x0, 0x0)
    /tmp/sandbox256874711/main.go:26 +0x220
main.main()
    /tmp/sandbox256874711/main.go:34 +0x100

这个问题回答了我为什么得到panic: interface conversion: interface is string

如果我尝试将类型断言更改string为PlatformID的基础类型,则它甚至都不会编译tmp/sandbox325023244/main.go:26: cannot use dict["platform-id"].(string) (type string) as type PlatformID in return argument

那么,如何修改该return行以便可以检索PlatformID?

cookieisaac:

在使用了更多语法之后,我想我需要同时进行类型转换和类型断言。

所以下面的代码解决了这个问题

return PlatformID(dict["platform-id"].(string)), err

回想一下,我需要先将接口类型声明为基本类型string,然后从那里可以将类型转换为PlatformID

PS 1:用例是我在请求正文中获得了原始字符串,REST层将解析出字典中的某些字段,然后将其余未解析的字符串转发到API层以进行进一步处理。字典中的键因工作量而异,因此我无法真正将其解组为定义明确的结构。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将 es6 箭头函数参数替换为自定义类型(接口)?

打字稿:如何将特定的库方法转换为自定义类型定义

如何将Fsharp中的自定义类型转换为JSON字符串?

如何将 JSON 对象转换为自定义 C# 类型对象?

如何将XNode强制转换为自定义类型?

如何将查询结果中的对象转换为自定义类型

如何将LRESULT转换为自定义结构类型?

如何将字符串转换为自定义数据类型

如何将自定义类型定义文件转换为 npm 类型定义文件

将 List 接口转换为自定义 List 类

如何将自定义类型转换为原始类型?

如何将类型转换定义为自定义类型的字符串

如何将具有自定义类型的属性添加到 Node 的全局接口

如何将自定义类型转换为字符串?

如何将自定义类型列表转换为字符串列表

如何将自定义数据类型转换为数组数组

将表转换为自定义类型的数组

Postgres将数组转换为自定义类型

如何将接口转换为具体类型

如何将接口{}转换为其基础类型

如何将 DataTable 输出转换为自定义模型?

如何将抖动的BLoC流快照转换为自定义对象?

Python 如何将现有的本机 dict 转换为自定义 dict 对象?

如何将JSONObject转换为自定义Java类?

如何将JSON字符串日期转换为自定义格式日期?

如何将 IQueryable/IEnumerable 结果转换为自定义模型 C# EntityFramework

如何将 IQueryable 转换为自定义类的列表?

如何将日期字符串转换为自定义日期格式?

如何将JSON对象转换为自定义C#对象?