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
相关产品推荐
相关产品推荐

