Datetime 为什么map[time.time]字符串有时不起作用?

Datetime 为什么map[time.time]字符串有时不起作用?,datetime,go,associative-array,Datetime,Go,Associative Array,这是一个当map[time.time]字符串不起作用时显示的示例 package main import ( "fmt" "time" ) type MyDate time.Time func NewMyDate(year, month, day int, tz time.Location) (MyDate, error) { return MyDate(time.Date(year, time.Month(month), day, 0, 0, 0, 0, &

这是一个当map[time.time]字符串不起作用时显示的示例

package main

import (
    "fmt"
    "time"
)

type MyDate time.Time

func NewMyDate(year, month, day int, tz time.Location) (MyDate, error) {
    return MyDate(time.Date(year, time.Month(month), day, 0, 0, 0, 0, &tz)), nil
}

func (md MyDate)ToTime() time.Time {
    return time.Time(md)
}

func main()  {
    timeMap := make(map[time.Time]string)

    md1, _ := NewMyDate(2019, 1, 1, *time.UTC)
    md2, _ := NewMyDate(2019, 1, 1, *time.UTC)

    timeMap[md1.ToTime()] = "1"
    timeMap[md2.ToTime()] = "2"

    for k, v := range timeMap {
        fmt.Println(k, v)
    }
}
输出:

2019-01-01 00:00:00+0000 UTC 1


2019-01-01 00:00:00+0000 UTC 2您的时区指针每次都不同。通过显式提供指针解决此问题:

func NewMyDate(year, month, day int, tz *time.Location) (MyDate, error) {
    return MyDate(time.Date(year, time.Month(month), day, 0, 0, 0, 0, tz)), nil
}

操场:。

你的时区指针每次都不一样。通过显式提供指针解决此问题:

func NewMyDate(year, month, day int, tz *time.Location) (MyDate, error) {
    return MyDate(time.Date(year, time.Month(month), day, 0, 0, 0, 0, tz)), nil
}
操场:

&tz指的是NewMyDate参数的地址,每个调用的地址可能不同。在Go中,函数参数按值传递

每次通话使用相同的时区。比如说,

package main

import (
    "fmt"
    "time"
)

type MyDate time.Time

func NewMyDate(year, month, day int, tz *time.Location) (MyDate, error) {
    return MyDate(time.Date(year, time.Month(month), day, 0, 0, 0, 0, tz)), nil
}

func (md MyDate) ToTime() time.Time {
    return time.Time(md)
}

func main() {
    timeMap := make(map[time.Time]string)

    md1, _ := NewMyDate(2019, 1, 1, time.UTC)
    md2, _ := NewMyDate(2019, 1, 1, time.UTC)

    timeMap[md1.ToTime()] = "1"
    timeMap[md2.ToTime()] = "2"

    for k, v := range timeMap {
        fmt.Println(k, v)
    }
}
游乐场:

输出:

2019-01-01 00:00:00 +0000 UTC 2
&tz指的是NewMyDate参数的地址,每个调用的地址可能不同。在Go中,函数参数按值传递

每次通话使用相同的时区。比如说,

package main

import (
    "fmt"
    "time"
)

type MyDate time.Time

func NewMyDate(year, month, day int, tz *time.Location) (MyDate, error) {
    return MyDate(time.Date(year, time.Month(month), day, 0, 0, 0, 0, tz)), nil
}

func (md MyDate) ToTime() time.Time {
    return time.Time(md)
}

func main() {
    timeMap := make(map[time.Time]string)

    md1, _ := NewMyDate(2019, 1, 1, time.UTC)
    md2, _ := NewMyDate(2019, 1, 1, time.UTC)

    timeMap[md1.ToTime()] = "1"
    timeMap[md2.ToTime()] = "2"

    for k, v := range timeMap {
        fmt.Println(k, v)
    }
}
游乐场:

输出:

2019-01-01 00:00:00 +0000 UTC 2

该贴图按预期工作,但是,您的关键点不相等。 如果添加fmt.Printlnmd1.ToTime==md2.ToTime,您将看到

从:

比较运算符==和!=必须为键类型的操作数完全定义;因此,键类型不能是函数、映射或切片。如果键类型是接口类型,则必须为动态键值定义这些比较运算符;失败将导致运行时恐慌


该贴图按预期工作,但是,您的关键点不相等。 如果添加fmt.Printlnmd1.ToTime==md2.ToTime,您将看到

从:

比较运算符==和!=必须为键类型的操作数完全定义;因此,键类型不能是函数、映射或切片。如果键类型是接口类型,则必须为动态键值定义这些比较运算符;失败将导致运行时恐慌


虽然下面的答案可能适用于这种特殊情况,但我建议永远不要使用time.time作为地图键。时间。从系统时钟生成时,时间在相等性方面不具有可靠的可比性,因为它包含一个用于调整倾斜的私有单调时钟值。虽然下面的答案可能适用于这种特殊情况,但我建议永远不要使用时间。时间作为映射键。时间。当从系统时钟生成时,时间在相等性方面不具有可靠的可比性,因为它包含一个私有的单调时钟值来调整倾斜。