为何将&符号传入fmt.Print无法打印bytes.Buffer变量的地址?
问题解答
核心原因:fmt包的接口适配逻辑
Go的fmt.Print系列函数会根据参数类型做特殊处理:当参数实现了fmt.Stringer或io.WriterTo接口时,会优先调用对应方法生成输出,而非直接打印指针地址或默认格式。
bytes.Buffer的指针类型*bytes.Buffer同时实现了这两个接口:
String()方法返回缓冲区的字符串内容WriteTo()方法直接将缓冲区内容写入输出流
所以当你传入&temp_buff时,fmt.Print会自动调用这些接口方法,输出缓冲区里的文本,而不是指针地址。
如何打印指针地址
如果确实要输出temp_buff的地址,用格式化输出明确指定即可:
fmt.Printf("%p", &temp_buff)
这样就能得到变量的内存地址,比如0xc000010280这类格式。
额外说明
你用fmt.Fprintf(&temp_buff, ...)时必须传指针,是因为Fprintf要求参数实现io.Writer接口,而只有*bytes.Buffer实现了这个接口;但fmt.Print的参数是任意类型,这里的指针触发了接口适配逻辑,才导致输出内容而非地址。
内容的提问来源于stack exchange,提问作者Тимур Имашев
相关产品推荐
相关产品推荐

