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