打印字节时的不同行为

时间:2018-10-26 09:35:24

标签: string pointers go struct

当我执行此操作时:

insertvertex()

它打印buf := new(bytes.Buffer) buf.WriteString("Hello world") fmt.Println(buf)

但是,如果我执行此操作:

Hello World

它打印:var buf bytes.Buffer buf.WriteString("Hello world") fmt.Println(buf)

我知道这是结构byte.Buffer的内容,但是为什么以不同的格式打印?

1 个答案:

答案 0 :(得分:9)

因为类型*bytes.Buffer的值具有String()方法(*bytes.Buffer的{​​{3}}包含String()方法)和类型{ {1}}没有。

然后bytes.Buffer包检查要打印的值是否具有fmt方法,如果有,则调用该方法以产生值的字符串表示形式。

引用method set软件包的文档:

  

除了使用动词%T和%p进行打印时,特殊的格式注意事项适用于实现某些接口的操作数。按申请顺序:

     
      
  1. 如果操作数是reflect.Value,则将操作数替换为其所保存的具体值,并使用下一条规则继续打印。

  2.   
  3. 如果操作数实现Formatter接口,则将调用它。格式化程序可以很好地控制格式化。

  4.   
  5. 如果%v动词与#标志(%#v)一起使用,并且操作数实现GoStringer接口,则会被调用。

  6.   
     

如果格式(对于Println等而言是隐含的%v)对于字符串(%s%q%v%x%X)有效,则以下两个规则适用:

     
      
  1. 如果操作数实现了error接口,则将调用Error方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。

  2.   
  3. 如果操作数实现方法String()字符串,则将调用该方法将对象转换为字符串,然后将根据动词的要求对其进行格式化(如果有)。

  4.   

String() string方法以Buffer.String()的形式返回其内容,这就是您传递string类型的指针时看到的内容。并且当您传递类型为*bytes.Buffer的非指针值时,它就像普通的struct值一样被简单地打印,其默认格式为:

bytes.Buffer

查看相关/类似问题:

fmt

The difference between t and *t

Why not use %v to print int and string