You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Golang中*time.Time打印显示时间戳而非内存地址?

问题解答

这是Go语言fmt包的设计特性导致的:

  • 像*string这类普通类型指针,因为string没有实现fmt.Stringer接口,fmt默认会打印指针的内存地址。
  • 而time.Time类型实现了fmt.Stringer接口(自带String() string方法),当fmt处理*time.Time指针时,会自动解引用指针,调用time.Time的String()方法输出格式化后的时间字符串,而非指针地址。

如果要强制打印TestTime的指针地址,改用%p格式化符号即可:

fmt.Printf("TestTime 指针地址: %p", req.TestTime)

你代码里的行为完全正常:虽然打印结构体时TestTime显示的是时间值,但它本质还是*time.Time指针——所以你用*req.TestTime能正确获取time.Time实例,判断req.TestTime != nil也能准确识别字段是否被赋值。

额外说明:除了time.Time,Go里不少常用类型(比如error)也实现了fmt.Stringer,它们的指针在fmt输出时都会被自动解引用显示实际值,这是为了方便开发者直接查看有效信息,不用每次手动解引用。

内容的提问来源于stack exchange,提问作者JDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:40:47