Strings e Runes

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório foca em strings e runes em Go. Em Go, strings são fatias de bytes somente leitura, e runes são inteiros que representam pontos de código Unicode. Este laboratório explorará como trabalhar com strings e runes em Go.

Strings e Runes

O problema a ser resolvido neste laboratório é entender como trabalhar com strings e runes em Go. Especificamente, o laboratório abordará como obter o comprimento de uma string, como indexar em uma string, como contar o número de runes em uma string e como iterar sobre as runes em uma string.

Para completar este laboratório, você precisará:

  • Uma compreensão básica da sintaxe Go
  • Conhecimento de strings e runes em Go
  • A biblioteca padrão Go
$ go run strings-and-runes.go
Len: 18
e0 b8 aa e0 b8 a7 e0 b8 b1 e0 b8 aa e0 b8 94 e0 b8 b5
Rune count: 6
U+0E2A 'ส' starts at 0
U+0E27 'ว' starts at 3
U+0E31 'ั' starts at 6
U+0E2A 'ส' starts at 9
U+0E14 'ด' starts at 12
U+0E35 'ี' starts at 15

Using DecodeRuneInString
U+0E2A 'ส' starts at 0
found so sua
U+0E27 'ว' starts at 3
U+0E31 'ั' starts at 6
U+0E2A 'ส' starts at 9
found so sua
U+0E14 'ด' starts at 12
U+0E35 'ี' starts at 15

A seguir, o código completo:

// Uma string Go é uma fatia de bytes somente leitura. A linguagem
// e a biblioteca padrão tratam strings de forma especial - como
// contêineres de texto codificados em [UTF-8](https://en.wikipedia.org/wiki/UTF-8).
// Em outras linguagens, strings são feitas de "caracteres".
// Em Go, o conceito de um caractere é chamado de `rune` - é
// um inteiro que representa um ponto de código Unicode.
// [Esta postagem do blog Go](https://go.dev/blog/strings) é uma boa
// introdução ao tópico.

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {

    // `s` é uma `string` atribuída a um valor literal
    // representando a palavra "olá" em tailandês
    // idioma. Literais de string Go são UTF-8
    // texto codificado.
    const s = "สวัสดี"

    // Como strings são equivalentes a `[]byte`, isso
    // produzirá o comprimento dos bytes brutos armazenados dentro.
    fmt.Println("Len:", len(s))

    // Indexar em uma string produz os valores de byte brutos em
    // cada índice. Este loop gera os valores hexadecimais de todos
    // os bytes que constituem os pontos de código em `s`.
    for i := 0; i < len(s); i++ {
        fmt.Printf("%x ", s[i])
    }
    fmt.Println()

    // Para contar quantas _runes_ estão em uma string, podemos usar
    // o pacote `utf8`. Observe que o tempo de execução de
    // `RuneCountInString` depende do tamanho da string,
    // porque ele precisa decodificar cada rune UTF-8 sequencialmente.
    // Alguns caracteres tailandeses são representados por vários UTF-8
    // pontos de código, então o resultado desta contagem pode ser surpreendente.
    fmt.Println("Rune count:", utf8.RuneCountInString(s))

    // Um loop `range` lida com strings especialmente e decodifica
    // cada `rune` junto com seu deslocamento na string.
    for idx, runeValue := range s {
        fmt.Printf("%#U starts at %d\n", runeValue, idx)
    }

    // Podemos alcançar a mesma iteração usando o
    // função `utf8.DecodeRuneInString` explicitamente.
    fmt.Println("\nUsing DecodeRuneInString")
    for i, w := 0, 0; i < len(s); i += w {
        runeValue, width := utf8.DecodeRuneInString(s[i:])
        fmt.Printf("%#U starts at %d\n", runeValue, i)
        w = width

        // Isso demonstra a passagem de um valor `rune` para uma função.
        examineRune(runeValue)
    }
}

func examineRune(r rune) {

    // Valores entre aspas simples são _literais de rune_. Nós
    // pode comparar um valor `rune` a um literal de rune diretamente.
    if r == 't' {
        fmt.Println("found tee")
    } else if r == 'ส' {
        fmt.Println("found so sua")
    }
}

Resumo

Este laboratório abordou como trabalhar com strings e runes em Go. Ele demonstrou como obter o comprimento de uma string, como indexar em uma string, como contar o número de runes em uma string e como iterar sobre as runes em uma string. Ao concluir este laboratório, você deverá ter uma melhor compreensão de como trabalhar com strings e runes em Go.