登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-02 13:18:37 255浏览 收藏

最近发现不少小伙伴都对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

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

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>