Преобразование string в []byte и обратно

Преобразование между типами string и []byte в Go выполняется с помощью явного приведения типов. Для преобразования строки в срез байт нужно написать []byte(str), а для обратного преобразования - string(bytes). Важно понимать, что при таком преобразовании создается новая копия данных, поэтому изменения в срезе байт не влияют на исходную строку, и наоборот.

Преобразование string в []byte

Для преобразования строки в срез байт используется конструкция []byte(str). В результате мы получаем срез, содержащий байтовое представление строки в кодировке UTF-8.

Пример

Давайте преобразуем строку "abcde" в срез байт и выведем его содержимое:

gopackage main

import "fmt"

func main() {
  str := "abcde"
  bytes := []byte(str)
  fmt.Println(bytes)
}

Результат выполнения кода:

go[97 98 99 100 101]

Как видите, каждый символ строки преобразуется в соответствующий байтовый код ASCII.

Пример

Давайте преобразуем строку с русскими символами в срез байт:

gopackage main

import "fmt"

func main() {
  str := "привет"
  bytes := []byte(str)
  fmt.Println(bytes)
}

Результат выполнения кода:

go[208 191 209 128 208 184 208 178 208 181 209 130]

В этом случае каждый символ кодируется несколькими байтами в кодировке UTF-8.

Преобразование []byte в string

Для обратного преобразования среза байт в строку используется конструкция string(bytes). Это позволяет восстановить строку из ее байтового представления.

Пример

Давайте преобразуем срез байт обратно в строку:

gopackage main

import "fmt"

func main() {
  bytes := []byte{97, 98, 99, 100, 101}
  str := string(bytes)
  fmt.Println(str)
}

Результат выполнения кода:

go"abcde"

Пример

Давайте преобразуем срез байт с кириллическими символами в строку:

gopackage 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)
}

Результат выполнения кода:

go"привет"

Важные нюансы

При преобразовании string в []byte и обратно создается копия данных. Это означает, что изменения в срезе байт не влияют на исходную строку. Однако, если вам нужно изменить строку, преобразование в []byte - это стандартный и эффективный способ.

Пример

Давайте покажем, что строка и срез байт независимы друг от друга:

gopackage 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))
}

Результат выполнения кода:

go"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,
    которая преобразует строку в срез рун