以结构为键编组映射

问题描述

我有一个结构体,其中一个字段是一个映射,键是另一个结构体。我使用的是 Go 16.1 版,并且据说此版本支持以这种方式创建的地图(尽管不确定字段何时是地图)。以下是因类型不支持错误而失败的相关代码和测试。

package model

import (
    "encoding/json"
    slog "github.com/go-eden/slf4go"
)

type User struct{
    ID       string             `json:"id" bson:"_id,omitempty"`
    FName    string             `json:"fName"`
    MName    string             `json:"mName"`
    LName    string             `json:"lName"`
    Jobs     map[*Job]float64 `json:"jobs,omitempty"`
    Password string             `json:"password"`
    IsAdmin bool                `json:"isAdmin"`

}

func (u *User)IsModel()bool{
    return true
}

func(u * User)ToJSON()string{
    //var jsonUser string;
    b,err := json.Marshal(u)
    if err !=nil {
        slog.Info(err)
        return err.Error()
    }
    return string(b)
}
func (u * User)FromJSON(jsonString string)bool{
    err := json.Unmarshal([]byte(jsonString),u)
    if err != nil{
        return false
    }
    return true
}



结构作业是:

package model

import "encoding/json"

type Job struct{
    ID string `json:"id" bson:"_id,omitempty"`
    Name string `json:"name"`

}

func(j *Job)IsModel()bool{
    return true
}

func(j *Job) ToJSON()string{
    b,err := json.Marshal(j)
    if err !=nil {
        return err.Error()
    }
    return string(b)
}

func(j *Job) FromJSON(jsonString string)bool{
    err := json.Unmarshal([]byte(jsonString),j)
    if err != nil{
        return false
    }
    return true
}


最后失败的测试如下(将作业添加到作业映射后编组失败):


package model

import (
    
    "fmt"
    "reflect"
    "testing"
)

func TestUser_ToJSON(t *testing.T) {
    user := &User{
        ID:       "",FName:    "Mike",MName:    "",LName:    "Clovis",Jobs:     make(map[*Job]float64),Password: "xyz",IsAdmin: true,}
    newUser := &User{}
    fmt.Println(user.ToJSON())
    job := &Job{
        ID:   "1",Name: "Cashier",}
    user.Jobs[job] = 12.99
    fmt.Println("User as json")
    fmt.Println(user.ToJSON())
    newUser.FromJSON(user.ToJSON())
    fmt.Println(newUser)
    if reflect.DeepEqual(user,newUser) {
        fmt.Println(newUser)
    }else{
        fmt.Println(user)
        fmt.Println(newUser)
        t.Error("Cannot marshal and unmarshal User struct")
    }
    dUser := *user
    fmt.Println(dUser)
}

通过我阅读的文档,这应该可行!如果有人有建议或解决方法,我将不胜感激。作为仅供参考,我尝试制作地图,其中键既是工作又是指向工作的指针,结果相同。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)