在golang

时间:2017-09-12 16:26:13

标签: github go time

我是golang的新手,我正在尝试理解"非原子"的类型包装的代码示例。输入time.Time。

有问题的类型扩展来自github上的GDAX的Go客户端,go-coinbase-exchange project

预期的行为是来自项目的时间变量(coinbase.Time),它们是type Time time.Time(在项目的time.go文件中定义),表现得像以下示例用于扩展" atomic"键入int(来自blog.riff.org,因为它们可能会遵循基本类型的"继承"来处理Time.format等函数(来自golang's standard implementation of time

package main
import "fmt"
type Int int

func (i Int) Add(j Int) Int {
  return i + j
}

func main() {
  i := Int(5)
  j := Int(6)
  fmt.Println(i.Add(j))
  fmt.Println(i.Add(j) + 12)
}

但是,如果我修改Readme.md中找到的项目List Account Ledger示例中的代码示例,以包含一个打印函数,否则可能会给我一个人类可读的CreatedAt结构变量视图(如下所示),我收到一个编译错误,说"类型coinbase.Time没有字段或方法Format":

for _, e := range ledger {
    print("Entry Creation: ")
    fmt.Printf(e.CreatedAt.Format("2006-01-02 15:04:05.999999+00"))
}

for循环内的预期行为是以人类可读的格式打印分类帐条目。我可以获取结构的内容,但我不确定如何使用生成的wallextloc成员。

例如,将fmt.Printf("%#v", e.CreatedAt)插入for循环会让我看到时间如下:

coinbase.Time{wall:0x3015a123, ext:63612345678, loc:(*time.Location)(nil)} {806986000 63638738354 <nil>}

我还可以看到wall的类型为uint64ext的类型为int64,而loc只是GMT / UTC = 0通过将变量格式化为字符串,因为fmt.Printf("%s", e.CreatedAt)给出了类似于以下内容的输出:

{%!s(uint64=712345678) %!s(int64=63612345678) %!s(*time.Location=<nil>)}

似乎我错过了一些东西。我通过issues tab on github要求提供更多信息,但这可能是个问题。所以我不确定响应时间会有多快,而且我对在go中扩展非原子类型的更一般情况感兴趣。

1 个答案:

答案 0 :(得分:1)

Named types不从基础类型继承任何方法(实际上Go中根本没有继承);您必须转换为基础类型以调用该类型中的任何方法:

(time.Time(e.CreatedAt)).Format("2006-01-02 15:04:05.999999+00")