Строки в Go — это иммутабельные массивы байт. Для стандартного компилятора Go внутренняя структура строки описана как:
type _string struct {
elements *byte // байты
len int // кол-во байт
}
После инициализации строку нельзя изменить и такая иммутабельность позволяет избежать побочных эффектов в коде.
s := "hello"
s[4] = "" // ошибка компиляции: cannot assign to s[4] (strings are immutable)
Стоит отметить, что тип данных byte
— это алиас к типу uint8
(0-255). Во-первых, потому что нужно абстрактно отличать типы в коде. Во-вторых, байты представляют ASCII символы, а в кодовой таблице ASCII символов 256 кодов:
package main
import "fmt"
func main() {
s := "hey"
fmt.Println(s[0], s[1], s[2]) // 104 101 121
fmt.Println(string(s[0]), string(s[1]), string(s[2])) // h e y
}
Большинство библиотечных функций работают со слайсами байт []byte
для производительности. Конвертация строки в слайс байт описывается в коде явно:
package main
import "fmt"
func main() {
s := "hey"
bs := []byte(s)
fmt.Println([]byte(s)) // [104 101 121]
fmt.Println(string(bs)) // hey
}
Отдельные ASCII символы можно объявлять сразу с типом byte
. Для этого нужно обернуть символ в одинарные кавычки и указать тип byte
:
package main
import (
"fmt"
"reflect"
)
func main() {
asciiCh := byte('Z')
asciiChStr := string(asciiCh)
fmt.Println(reflect.TypeOf(asciiCh), asciiCh) // uint8 90
fmt.Println(reflect.TypeOf(asciiChStr), asciiChStr) // string Z
}
![Аватары экспертов Хекслета](https://cdn2.hexlet.io/assets/faces/mentors-756ab67c814cd4c22715666812a66c9dac9ac2d20176a10b0e932ee851a918e0.png)
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»