为了账号安全,请及时绑定邮箱和手机立即绑定

通过自定义类型使用时日期格式发生变化

通过自定义类型使用时日期格式发生变化

Go
DIEA 2022-11-23 19:23:59
我对 golang 很陌生,但仍在为很多事情而苦苦挣扎。当实现像这样的自定义类型时type Date time.Time,定义一种方法来编组/解组"2006-01-02"格式的日期(来自 JSON 文件和 POST API 请求),日期存储在结构中的最终方式是:{wall:0 ext:63776764800 loc:<nil>}有人可以帮助我理解为什么这种格式(而不是常规格式time.Time)因为自定义类型Date是大写的,因此被导出了吗?这是一个实现(链接到代码下方的游乐场):package mainimport (    "encoding/json"    "fmt"    "log"    "time")const sample = `{    "ID": "1",    "ticker": "S30J2",    "issueDate": "2022-01-31",    "maturity": "2023-06-30",    "coupon": 0,    "cashFlow": [        {   "date": "2022-06-30",            "rate": 0,            "amortization": 1,            "residual": 0,            "amount": 50},            {            "date": "2023-06-30",            "rate": 0,            "amortization": 1,            "residual": 0,            "amount": 50}    ]}`type Date time.Timefunc (d Date) MarshalJSON() ([]byte, error) {    return []byte(time.Time(d).Format("2006-1-2")), nil}func (d *Date) UnmarshalJSON(b []byte) error {    // Disregard leading and trailing "    t, err := time.Parse("2006-1-2", string(b[1:len(b)-2]))    if err != nil {        return err    }    *d = Date(t)    return nil}type Flujo struct {    Date     Date    Rate     float64    Amort    float64    Residual float64    Amount   float64}type Bond struct {    ID        string    Ticker    string    IssueDate Date    Maturity  Date    Coupon    float64    Cashflow  []Flujo}func main() {    var b Bond    if err := json.Unmarshal([]byte(sample), &b); err != nil {        log.Fatalf("%s", err)    }    fmt.Printf("%+v\n", b.IssueDate)    // I need to wrap it via Format.    fmt.Println("Fecha: ", time.Time(b.IssueDate).Format("2006-01-02"))}这里的工作示例:https ://go.dev/play/p/YddzXA9PQdP感谢您的帮助和理解。
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

该类型Date是不同于 的新命名类型time.Time,并且没有为 定义的方法time.Time。marshal/unmarshal 方法工作得很好,但fmt.Print函数族使用Stringer接口(如果存在)。因此,如果您声明:


func (d Date) String() string {

    x, _ := d.MarshalJSON()

    return string(x)

}

它将正确打印。


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信