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

Go语言结构体类型指针行为疑问:为何time实例取址打印仍为时间?

问题解答

核心原因在于time.Time类型与int类型在fmt包处理逻辑上的差异:

  • 对于int这类基础类型,它们没有实现fmt.Stringer接口,所以执行fmt.Println(&y)时,会直接输出变量的内存地址;*&y是对指针解引用操作,最终得到变量原值,因此输出7。
  • time.Time类型实现了fmt.Stringer接口,而Go的fmt包有一个内置规则:当传入指针类型参数时,如果该指针指向的类型实现了String()方法,fmt会自动对指针进行解引用,然后调用对应的String()方法,而非直接打印指针的内存地址。

所以第二段代码的三个打印逻辑实际都是调用了time.Time的String()方法:

  • fmt.Println(x)直接调用String()输出当前时间;
  • fmt.Println(&x)触发fmt的自动解引用逻辑,最终还是调用String()输出当前时间;
  • fmt.Println(*&x)等价于直接使用x,自然也输出当前时间。

如果需要打印time.Time变量的内存地址,可以使用格式化打印明确指定格式:

fmt.Printf("%p\n", &x)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:00