我有一些代码,打印一条消息“你好,欢迎来到 2021 年的教育”
package main
import (
"fmt"
"bytes"
)
func main() {
// declaring variables of different datatypes
var message string = "Hello and welcome to "
var year int = 2021
// temporary buffer
var temp_buff bytes.Buffer
// printing out the declared variables as a single string
fmt.Fprintf(&temp_buff, "%s educative in %d", message, year)
fmt.Print(&temp_buff)
}
我期望最后一个
fmt.Print
将地址打印到temp_buff 变量。为什么这没有发生?我没有看到 temp_buffer 变量被定义为指向 bytes.Buffer 的指针类型,还是以某种方式?
提前致谢
有一个
func (*bytes.Buffer) String()
method声明,所以fmt.Print()
使用它。
fmt.Print“格式使用其操作数的默认格式”。默认值遵循以下约定:如果值的类型定义了
String()
方法,那么该方法就是它的显示方式。详情与fmt.Stringer
接口类型有关
使用
fmt.Printf()
你可以得到你想要的,通过使用fmt.Printf("%p", &temp_buff)
.
bytes.Buffer
是复合类型结构,不支持地址运算符&。如果要获取一个变量的地址,首先要将该变量转换为指针类型。所以fmt.Print(&temp_buff)
没有得到你想要的结果
在 Go 中,非文字复合结构可以分配在堆上而不是堆栈上。取非字面量复合结构的地址可能会导致一些问题,比如它的对齐和变量大小不能保证,所以Go不支持这样的操作。