我是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
循环内的预期行为是以人类可读的格式打印分类帐条目。我可以获取结构的内容,但我不确定如何使用生成的wall
,ext
和loc
成员。
例如,将fmt.Printf("%#v", e.CreatedAt)
插入for
循环会让我看到时间如下:
coinbase.Time{wall:0x3015a123, ext:63612345678, loc:(*time.Location)(nil)}
{806986000 63638738354 <nil>}
我还可以看到wall
的类型为uint64
,ext
的类型为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中扩展非原子类型的更一般情况感兴趣。
答案 0 :(得分:1)
Named types不从基础类型继承任何方法(实际上Go中根本没有继承);您必须转换为基础类型以调用该类型中的任何方法:
(time.Time(e.CreatedAt)).Format("2006-01-02 15:04:05.999999+00")