Короткий ответ: он не будет эффективным, потому что преобразование в строку требует создания полной копии байтового массива. Вот правильный (неэффективный) способ сделать то, что вы хотите:
buf := new(bytes.Buffer)
buf.ReadFrom(yourReader)
s := buf.String() // Does a complete copy of the bytes in the buffer.
Эта копия сделана как механизм защиты. Строки неизменны. Если бы вы могли преобразовать байт [] в строку, вы могли бы изменить содержимое строки. Однако go позволяет отключить механизмы безопасности типов с помощью небезопасного пакета. Используйте небезопасный пакет на свой страх и риск. Надеюсь, одно только имя является достаточно хорошим предупреждением. Вот как я бы сделал это, используя unsafe:
buf := new(bytes.Buffer)
buf.ReadFrom(yourReader)
b := buf.Bytes()
s := *(*string)(unsafe.Pointer(&b))
Итак, вы эффективно преобразовали свой байтовый массив в строку. На самом деле все, что это делает - это обманывает систему типов, называя ее строкой. У этого метода есть пара предостережений:
- Нет никаких гарантий, что это будет работать во всех компиляторах go. Хотя это работает с компилятором gc plan-9, оно опирается на «детали реализации», не упомянутые в официальной спецификации. Вы даже не можете гарантировать, что это будет работать на всех архитектурах или не будет изменено в gc. Другими словами, это плохая идея.
- Эта строка изменчива! Если вы сделаете какие-либо вызовы в этом буфере, изменит строку. Будьте очень осторожны.
Мой совет - придерживаться официального метода. Создание копии не стоит , что дорого и не стоит зла небезопасного. Если строка слишком велика для копирования, вам не следует превращать ее в строку.