Разное поведение при печати байтов. Буфер в Go - PullRequest
0 голосов
/ 26 октября 2018

Когда я выполняю это:

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

, он печатает Hello World.

Но если я выполняю это:

var buf bytes.Buffer
buf.WriteString("Hello world")
fmt.Println(buf)

, он печатает: {[72 101 108 108 111 32 119 111 114 108 100] 0 [72 101 108 108 111 32 119 111 114 108 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0}

Я понимаю, что это содержимое структуры byte.Buffer но почему оно печатается в другом формате?

1 Ответ

0 голосов
/ 26 октября 2018

Поскольку значение типа *bytes.Buffer имеет метод String() (набор методов из *bytes.Buffer содержит метод String()), а значение типа bytes.Buffer - нет.

А пакет fmt проверяет, имеет ли напечатанное значение метод String() string, и если это так, он вызывается для получения строкового представления значения.

Цитирование из пакета документов fmt:

За исключением случаев, когда при печати используются глаголы% T и% p, особые соображения по форматированию применяются к операндам, которые реализуют определенные интерфейсы. В порядке применения:

  1. Если операнд является отражающим. Значение, операнд заменяется конкретным значением, которое он содержит, и печать продолжается со следующим правилом.

  2. Если операнд реализует интерфейс Formatter, он будет вызван. Форматтер обеспечивает точный контроль форматирования.

  3. Если глагол% v используется с флагом # (% # v) и операнд реализует интерфейс GoStringer, он будет вызван.

Если формат (который неявно% v для Println и т. Д.) Действителен для строки (% s% q% v% x% X), применяются следующие два правила:

  1. Если операнд реализует интерфейс ошибки, будет вызван метод Error для преобразования объекта в строку, которая затем будет отформатирована в соответствии с требованиями глагола (если есть).

  2. Если операнд реализует метод String () string, этот метод будет вызываться для преобразования объекта в строку, которая затем будет отформатирована в соответствии с требованиями глагола (если есть).

Метод Buffer.String() возвращает его содержимое в виде string, это то, что вы видите напечатанным, когда передаете указатель типа *bytes.Buffer. И когда вы передаете значение без указателя типа bytes.Buffer, оно просто печатается как обычное значение структуры, для которого формат по умолчанию:

{field0 field1 ...}

См. Похожие / похожие вопросы:

Разница между t и * t

Почему бы не использовать% v для печати int и строки

Почему Error () имеет приоритет над String ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...