文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用泛型将结构转换为映射

2024-04-04 23:59

关注

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《使用泛型将结构转换为映射》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我一直在尝试使用如下泛型将结构转换为地图

// You can edit this code!
// Click here and start typing.
package main

import (
    "encoding/json"
    "fmt"
)

type Data interface {
    int64 | float64 | string
}

type Server struct {
    Name    string
    ID      int32
    Enabled bool
}

func ConvertStructToMap[K comparable, V Data](in interface{}) map[string]V {
    var inInterface map[string]V
    inrec, _ := json.Marshal(in)
    json.Unmarshal(inrec, &inInterface)
    return inInterface

}

func main() {

    s := &Server{
        Name:    "gopher",
        ID:      123456,
        Enabled: true,
    }
    conv := ConvertStructToMap(s)
    fmt.Println(conv)

}

但是它给了我一个错误

无法推断 k (prog.go:20:25)

我刚刚开始使用 go generics,我想要的是使用泛型将结构转换为映射。任何帮助将不胜感激


正确答案


虽然 golang 有泛型,但您正在尝试创建一个泛型映射,据我所知,这是行不通的:推断的类型只能是其中一种类型:

例如输入 3 种不同类型,对 stringint64float64 的严格返回映射的推断不起作用,您必须向编译器提供额外信息。 or 是文档中的重要单词(请参阅入门指南 https://go.dev/doc/tutorial/generics)

package main

import (
    "encoding/json"
    "fmt"
)

type Data interface {
    int64 | float64 | string
}

type Server struct {
    Name    string
    ID      int32
    Enabled bool
}

func ConvertStructToMap[V Data](in interface{}) map[string]V {
    var inInterface map[string]V
    inrec, _ := json.Marshal(in)
    json.Unmarshal(inrec, &inInterface)
    return inInterface

}

func main() {

    s := &Server{
        Name:    "gopher",
        ID:      123456,
        Enabled: true,
    }
    conv := ConvertStructToMap[int64](s)
    fmt.Println(conv)
}

因此,使用泛型,除非您只想解析出 1 种类型,否则您将无法到达您想要的位置。仍然进行类型检查(评论中提到的反射)效果会更好。

替代方案:json.rawmessage

如果您定义了 map[string]json.rawmessage,您可以使用它来进一步解码信息,方法是使用反射、e.(type) 或泛型对每个元素进行单独调用来解析该类型。您可能仍然会遇到推理问题,在这种情况下,可能必须使用 map[string] 接口{},而不是 json.rawmessage

以上就是《使用泛型将结构转换为映射》的详细内容,更多关于的资料请关注编程网公众号!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯