Строки

Что такое string или строки?

Строка в golang - это последовательность символов, которая представляет собой текстовые данные.
Строки в golang объявляются с типом string и заключаются в двойные кавычки, например:

1
2
3
var s string = "hello"
// или сокращенная запись
s := "hey"

Строки в golang являются неизменяемыми(immutable), то есть их нельзя модифицировать после создания. Однако, можно создавать новые строки из существующих, используя различные операции и функции.

Например, можно склеивать строки с помощью оператора +, сравнивать строки с помощью оператора ==, или применять функции из пакета strings для поиска, замены, преобразования и других манипуляций со строками.

Строки в golang хранят символы в кодировке UTF-8, которая поддерживает множество языков и специальных символов.

Каждый символ в строке называется руной (rune), которая является псевдонимом для типа int32. Руны можно получать из строк с помощью цикла for-range или функции range, а также преобразовывать в строки с помощью функции string.

Источники:

Какие особенности есть у string?

Строка в golang - это неизменяемая последовательность символов в кодировке UTF-8, которая представляет собой текстовые данные. Строки в golang имеют тип string и заключаются в двойные кавычки или обратные апострофы. Строки в golang поддерживают множество языков и специальных символов, включая русские буквы и эмодзи.

Строки в golang можно объединять, сравнивать, искать, заменять, преобразовывать и выполнять другие манипуляции с помощью различных функций из пакета strings. Строки в golang также можно преобразовывать в руны (кодовые значения символов) и байты (единицы хранения данных) для более низкоуровневой работы с текстом

Как устроена строка внутри, а точнее reflect.String и reflect.StringHeader?

reflect.String - это псевдоним для типа string, который является неизменяемой последовательностью символов в кодировке UTF-8.

reflect.StringHeader - это структура, которая содержит два поля: Data и Len. Data - это указатель на первый байт строки, а Len - это длина строки в байтах. Структура reflect.StringHeader может быть получена из строки с помощью функции unsafe.Pointer, которая преобразует любое значение в указатель безопасного типа. Например, можно использовать такой код:

1
2
3
s := "hello"
sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
fmt.Println(sh.Data, sh.Len) // выводит адрес и длину строки

Структура reflect.StringHeader может быть также использована для создания новой строки из существующей, изменяя ее указатель или длину. Например, можно использовать такой код:

1
2
3
4
5
s := "hello, world!"
sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
sh.Data += 7 // сдвигаем указатель на 7 байтов
sh.Len -= 7 // уменьшаем длину на 7 байтов
fmt.Println(s) // выводит "world!"

Однако, такое использование reflect.StringHeader может быть опасным, так как оно нарушает неизменяемость строк и может привести к непредвиденным ошибкам или поведению. Например, если мы изменим длину строки больше, чем ее емкость, то мы можем получить доступ к памяти, которая не принадлежит строке, и вызвать панику или нарушение сегментации. Также, если мы изменим указатель на данные, то мы можем потерять ссылку на оригинальную строку и вызвать утечку памяти или сборку мусора.

Поэтому, reflect.String и reflect.StringHeader следует использовать с осторожностью и только в тех случаях, когда это необходимо для решения конкретной задачи. В большинстве случаев, можно обойтись стандартными функциями и методами для работы со строками в golang.

1
2
3
4
5
6
7
8
9
var s string = "Let's"
fmt.Println(s)
t += " Go" // выделяется новая память на стеке
fmt.Println(s)

smile := "This is smile 😊"
fmt.Printf("len %v, rune %v\n", len(smile), utf8.RuneCountInString(smile))
fmt.Println(smile)

Напиши быструю инверсию строки(abc -> cba)

1
2
3
4
5
6
7
8
9
10
11
// Package reverse can reverse things, particularly strings.
package reverse

// String returns its argument string reversed rune-wise left to right.
func String(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}

Для общего развития можно посмотреть и на Ускорение конкатенации строк в Go своими руками

Вот вам и string

Поделиться