package main import ( "fmt" "unicode" "unicode/utf8" ) func main() { // ExampleBytesSlice() // ExampleRune() ExampleUnicode() } func ExampleBytesSlice() { // Используем строку, которую конвертируем в []byte, // чтобы показать, как выглядит байтовый срез. bs := []byte("Это байтовый срез") // Печатаем байтовый срез. fmt.Printf("Так байтовый срез выглядит внутри: %v\n", bs) // Демонстрируем, что быйтовый срез можно изменять, // а затем выводи его в виде строки. for i := range bs { // Для четных байтов увеличиваем на 1, для нечетных уменьшаем на 1 if bs[i]%2 == 0 { bs[i] = bs[i] + 1 } else { bs[i] = bs[i] - 1 } } // Печатаем измененный байтовый срез в виде строки. fmt.Printf("Измененный байтовый сред в виде строки: %s", bs) } func ExampleRune() { // Преобразуем строку в срез рун rs := []rune("Это срез рун") // Итерируемся по срезу рун и заменяем символ 'р' на '*' for i := range rs { // fmt.Println(rs[i]) if rs[i] == 'р' { rs[i] = '*' } } // Выводит измененный срез в виде строки fmt.Printf("Измененный срез в виде строки: %s\n", string(rs)) } func ExampleUnicode() { // функции ниже принимают на вход тип rune // проверка символа на цифру fmt.Println(unicode.IsDigit('1')) // true // проверка символа на букву fmt.Println(unicode.IsLetter('a')) // true // проверка символа на нижний регистр fmt.Println(unicode.IsLower('A')) // false // проверка символа на верхний регистр fmt.Println(unicode.IsUpper('A')) // true // проверка символа на пробел // пробел это не только ' ', но и: // '\t', '\n', '\v', '\f', '\r' - подробнее читайте в документации fmt.Println(unicode.IsSpace('\t')) // true // С помощью функции Is можно проверять на кастомный RangeTable: // например, проверка на латиницу: fmt.Println(unicode.Is(unicode.Latin, 'ы')) // false // функции преобразований fmt.Println(string(unicode.ToLower('F'))) // f fmt.Println(string(unicode.ToUpper('f'))) // F var en = "english" var ru = "русский" fmt.Println(len(en), len(ru)) fmt.Println(utf8.RuneCountInString(en), utf8.RuneCountInString(ru)) }