package main

import (
	"fmt"
	"strings"
)

func main() {
	// ExampleString()
	// ExampleEqualString()
	stringFunctions()
}

func ExampleString() {
	// Создадим строковый литерал s, значение которого "Это строка".
	// Строка состоит из 10 символов, но ее длина в байтах будет 19,
	// так как кириллические символы занимают 2 байта, а пробел - 1 байт.
	var s string = "Это строка"
	fmt.Printf("Длина строки: %d байт\n", len(s))

	// Получи подстоку строки
	fmt.Printf("Напечатаем только второе слово в кавычках: \"%v\"\n", s[7:])

	// Попробуем изменить строку (возникает ошибка компиляции, так как строки
	// неизменяемы):
	// s[3] = 12
	// Ошибка компиляции: cannot assign to s[3], потому что строки -
	// неизменяемые последовательности.

	// "Изменим строку", создав новую строку
	s = s + " Новая строка"
	fmt.Printf("%v\n", s)

	// Проитерируемся по строке
	for _, b := range s {
		fmt.Printf("%v", b)
	}
	fmt.Printf("\n")
}

func ExampleEqualString() {
	// Сравнение строк на равенство
	fmt.Printf("Сравнение на равенство строк \"строка1\" и \"строка2\": %v\n", "строка1" == "строка2")

	// Сравнение строк на неравенство
	fmt.Printf("Сравнение на неравенство строк \"строка1\" и \"строка2\": %v\n", "строка1" != "строка2")

	// Сравнение строк по алфавиту
	fmt.Printf("\"Строка1\" > \"Строка2\": %v\n", "Строка1" > "Строка2")

	// Output:
	// Сравнение на равенство строк "строка1" и "строка2": false
	// Сравнение на неравенство строк "строка1" и "строка2": true
	// "Строка1" > "Строка2": false
}

func stringFunctions() {
	fmt.Println(
		// Содержится ли подстрока в строке
		strings.Contains("test", "es"),

		// Количество подстрок в строке
		strings.Count("test", "t"),

		// Начинается ли строка с префикса
		strings.HasPrefix("test", "te"),

		// Заканчивается ли строка суффиксом
		strings.HasSuffix("test", "te"),

		// Возвращает начальный индекс подстроки в строке, а при отсутствии
		// вхождения возращает -1
		strings.Index("test", "e"),

		// объединяет массив строк через символ
		strings.Join([]string{"hello", "world"}, "-"),
		// результат: "hello-world"

		// Повторяет строку n раз подряд
		strings.Repeat("a", 5),
		// результат: "aaaaa"

		// Функция Replace заменяет любое вхождение old в вашей строке на new
		// Если значение n равно -1, то будут заменены все вхождения.
		// Общий вид: func Replace(s, old, new string, n int) string
		// Пример:
		strings.Replace("blanotblanot", "not", "***", -1),
		// результат: "bla***bla***"

		// Разбивает строку согласно разделителю
		strings.Split("a-b-c-d-e", "-"),
		// результат: []string{"a","b","c","d","e"}

		// Возвращает строку c нижним регистром
		strings.ToLower("TEST"),
		// результат: "test"

		// Возвращает строку c верхним регистром
		strings.ToUpper("test"),
		// результат: "TEST"

		// Возвращает строку с вырезанным набором
		strings.Trim("tetstet", "te"),
		// результат: s
	)

}
