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

时间:2019-01-11 13:57:12

标签: 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, &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

3 个答案:

答案 0 :(得分:5)

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)
    }
}

游乐场:https://play.golang.org/p/M10Xn4jsoKS

输出:

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

答案 1 :(得分:2)

您的时区指针每次都不同。通过显式提供指针来解决此问题:

import { any } from 'codelyzer/util/function';

export class NotFindeComponent {

  constructor(private parameterService:ParameterService) {}

  back() {
    this.parameterService.redirectToParameterForm(any);
  }
}

游乐场:https://play.golang.org/p/M10Xn4jsoKS

答案 2 :(得分:0)

Tha映射按预期工作,但是您的密钥不相等。 如果添加fmt.Println(md1.ToTime() == md2.ToTime()),您会看到。

来自documentation

  

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