我是 golang 的新手,正在尝试理解“非原子”类型 time.Time 的类型包装代码示例。
有问题的类型扩展来自 github 上 GDAX 的 Go 客户端,go-coinbase-exchange project。
预期的行为是来自项目 (coinbase.Time) 的时间变量,它们属于 type Time time.Time
(在项目的 time.go 文件中定义),其行为类似于以下用于扩展“原子”类型 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 结构变量的人类可读 View (如下所示),我会收到一个编译器错误,指出“类型 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 请求了更多信息,但也许这是一个 nube 问题。所以我不确定响应时间有多快,我对在 go 中扩展非原子类型的更一般情况感兴趣。
最佳答案
Named types不要从底层类型继承任何方法(实际上 Go 中根本没有继承);您必须转换为基础类型才能调用该类型的任何方法:
(time.Time(e.CreatedAt)).Format("2006-01-02 15:04:05.999999+00")
关于github - golang 中非原子类型的类型包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46181419/