Поскольку значение типа *bytes.Buffer
имеет метод String()
(набор методов из *bytes.Buffer
содержит метод String()
), а значение типа bytes.Buffer
- нет.
А пакет fmt
проверяет, имеет ли напечатанное значение метод String() string
, и если это так, он вызывается для получения строкового представления значения.
Цитирование из пакета документов fmt
:
За исключением случаев, когда при печати используются глаголы% T и% p, особые соображения по форматированию применяются к операндам, которые реализуют определенные интерфейсы. В порядке применения:
Если операнд является отражающим. Значение, операнд заменяется конкретным значением, которое он содержит, и печать продолжается со следующим правилом.
Если операнд реализует интерфейс Formatter, он будет вызван. Форматтер обеспечивает точный контроль форматирования.
Если глагол% v используется с флагом # (% # v) и операнд реализует интерфейс GoStringer, он будет вызван.
Если формат (который неявно% v для Println и т. Д.) Действителен для строки (% s% q% v% x% X), применяются следующие два правила:
Если операнд реализует интерфейс ошибки, будет вызван метод Error для преобразования объекта в строку, которая затем будет отформатирована в соответствии с требованиями глагола (если есть).
Если операнд реализует метод String () string, этот метод будет вызываться для преобразования объекта в строку, которая затем будет отформатирована в соответствии с требованиями глагола (если есть).
Метод Buffer.String()
возвращает его содержимое в виде string
, это то, что вы видите напечатанным, когда передаете указатель типа *bytes.Buffer
. И когда вы передаете значение без указателя типа bytes.Buffer
, оно просто печатается как обычное значение структуры, для которого формат по умолчанию:
{field0 field1 ...}
См. Похожие / похожие вопросы:
Разница между t и * t
Почему бы не использовать% v для печати int и строки
Почему Error () имеет приоритет над String ()