Преобразование string в []byte и обратно
Преобразование между типами string и []byte в Go выполняется с помощью явного приведения типов. Для преобразования строки в срез байт нужно написать []byte(str), а для обратного преобразования - string(bytes). Важно понимать, что при таком преобразовании создается новая копия данных, поэтому изменения в срезе байт не влияют на исходную строку, и наоборот.
Преобразование string в []byte
Для преобразования строки в срез байт используется конструкция []byte(str). В результате мы получаем срез, содержащий байтовое представление строки в кодировке UTF-8.
Пример
Давайте преобразуем строку "abcde" в срез байт и выведем его содержимое:
package main
import "fmt"
func main() {
str := "abcde"
bytes := []byte(str)
fmt.Println(bytes)
}
Результат выполнения кода:
[97 98 99 100 101]
Как видите, каждый символ строки преобразуется в соответствующий байтовый код ASCII.
Пример
Давайте преобразуем строку с русскими символами в срез байт:
package main
import "fmt"
func main() {
str := "привет"
bytes := []byte(str)
fmt.Println(bytes)
}
Результат выполнения кода:
[208 191 209 128 208 184 208 178 208 181 209 130]
В этом случае каждый символ кодируется несколькими байтами в кодировке UTF-8.
Преобразование []byte в string
Для обратного преобразования среза байт в строку используется конструкция string(bytes). Это позволяет восстановить строку из ее байтового представления.
Пример
Давайте преобразуем срез байт обратно в строку:
package main
import "fmt"
func main() {
bytes := []byte{97, 98, 99, 100, 101}
str := string(bytes)
fmt.Println(str)
}
Результат выполнения кода:
"abcde"
Пример
Давайте преобразуем срез байт с кириллическими символами в строку:
package main
import "fmt"
func main() {
bytes := []byte{208, 191, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130}
str := string(bytes)
fmt.Println(str)
}
Результат выполнения кода:
"привет"
Важные нюансы
При преобразовании string в []byte и обратно создается копия данных. Это означает, что изменения в срезе байт не влияют на исходную строку. Однако, если вам нужно изменить строку, преобразование в []byte - это стандартный и эффективный способ.
Пример
Давайте покажем, что строка и срез байт независимы друг от друга:
package main
import "fmt"
func main() {
str := "abcde"
bytes := []byte(str)
bytes[0] = 122 // меняем первый байт на 'z'
fmt.Println("Original string:", str)
fmt.Println("Modified bytes:", bytes)
fmt.Println("String from modified bytes:", string(bytes))
}
Результат выполнения кода:
"Original string: abcde"
"Modified bytes: [122 98 99 100 101]"
"String from modified bytes: zbcde"
Как видите, исходная строка осталась неизменной, а изменения затронули только срез байт.
Смотрите также
-
функцию
to-byte-slice,
которая преобразует другие типы в срез байт -
функцию
to-byte,
которая преобразует значение в тип byte -
функцию
to-string,
которая преобразует другие типы в строку -
функцию
to-rune-slice,
которая преобразует строку в срез рун