github - golang 中非原子类型的类型包装

标签 github go time

我是 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 循环内的预期行为是以人类可读的格式打印分类帐条目。我可以获得结构的内容,但我不确定如何使用生成的 wallextloc 成员。

例如,将 fmt.Printf("%#v", e.CreatedAt) 插入到 for 循环中可以得到如下所示的时间表示:

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

通过将变量格式化为字符串,我还可以看到 walluint64 类型,extint64 类型,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/

相关文章:

go - 实现梯度下降

24 小时格式的 iOS 时间

Git:从其他远程 pull

string - 如何查看映射键是否包含某些字符串?

github - Jekyll-bootstrap 如何为外部链接 Markdown ?

arrays - 如何在 json 响应中设置数组 goLang-gin

开始时间和结束时间之间的 PHP 时间循环

android - 强制 Android DateUtils.getRelativeDateTimeString() 忽略设备区域设置?

git push 显示 "Everything up-to-date"但比较显示差异

ajax - 隐藏 Github 页面的 api key