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

Format of date changes when using it via custom types

我是 golang 的新手,还在为很多事情苦苦挣扎。

在实现像这样的自定义类型时 type Date time.Time,定义一种方法 marshal/unmarshal 以 "2006-01-02" 格式出现的日期(来自 JSON 文件和 POST API 请求),日期在结构中存储的最终方式是:

{wall:0 ext:63776764800 loc:<nil>}

谁能帮我理解为什么自定义类型 Date 是大写的格式(而不是常规 time.Time),因此导出?

这里是一个实现(link 代码下面的游乐场):

package main

import (
    "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.Time

func (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

感谢您的帮助和理解。

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

func (d Date) String() string {
    x, _ := d.MarshalJSON()
    return string(x)
}

它将正确打印。