O uso de strings.Título
Tradicionalmente, podemos colocar a primeira letra de cada palavra em maiúscula da seguinte forma, por exemplo:
func TestTitle(t *testing.T) {
fmt.Println(strings.Title("hello world"))
fmt.Println(strings.Title("hell golang"))
fmt.Println(strings.Title("xiexie"))
}
Execute o código acima e os resultados de impressão correspondentes serão os seguintes:
Hello World
Hell Golang
Xiexie
Como você pode ver, strings.Title colocará a primeira letra de cada palavra em maiúscula.
Existem também duas funções em strings: ToTitle e ToUpper, que possuem funções semelhantes, e todos os caracteres são transformados em letras maiúsculas.
Os exemplos são os seguintes:
func TestTitle2(t *testing.T) {
fmt.Println(strings.ToTitle("hello world"))
fmt.Println(strings.ToUpper("hello golang"))
}
A saída é a seguinte:
HELLO WORLD
HELLO GOLANG
Mas você pode ver que a função Title foi abandonada nos prompts do IDE e nos documentos oficiais. O principal motivo é: as regras para strings.Title estão usando limites de palavras, que não lidam corretamente com a pontuação Unicode.
Os exemplos são os seguintes:
func TestTitle3(t *testing.T) {
fmt.Println(strings.Title("here comes o'brian"))
}
A saída é a seguinte:
Here Comes O'Brian
Percebe-se que o “B” também está maiúsculo.
Dois problemas principais com strings.Title:
- A pontuação Unicode não é tratada corretamente.
- As regras de capitalização de línguas humanas específicas não são levadas em consideração.
Problemas Unicode
Vejamos outro exemplo sobre pontuação Unicode:
func TestTitle5(t *testing.T) {
a := strings.Title("go.go\u2024go")
b := "Go.Go\u2024Go"
if a != b {
fmt.Printf("%s != %s\n", a, b)
}
}
A saída é:
Go.Go․go != Go.Go․Go
O resultado do processamento de conversão variável é "Go.Go․go", mas de acordo com a necessidade real, deve ser "Go.Go․Go".
problemas específicos de idioma
código mostrado abaixo:
func TestTitle6(t *testing.T) {
fmt.Println(strings.Title("ijsland"))
}
Na palavra holandesa, "ijsland" deveria ser maiúsculo como "IJsland", mas o resultado é convertido para "Ijsland".
pacote golang.org/x/text/cases
Conforme mencionado na documentação de strings.Title, a função de strings.Title pode ser substituída por golang.org/x/text/cases, ou seja, cases.Title.
cases.Title fornece um mapa de caso específico do idioma, que possui uma função Title com a seguinte assinatura:
// Title returns a Caser for language-specific title casing. It uses an
// approximation of the default Unicode Word Break algorithm.
func Title(t language.Tag, opts ...Option) Caser {
return Caser{makeTitle(t, getOpts(opts...))}
}
O primeiro parâmetro é do tipo idioma.Tag, representando tags de idioma BCP 47. É usado para especificar uma instância de um idioma ou localidade específica.
O segundo parâmetro é um parâmetro indeterminado do tipo Option.
Antes de usá-lo, você precisa importar a biblioteca de classes "golang.org/x/text". por exemplo:
require golang.org/x/text v0.11.0
Os exemplos de uso são os seguintes:
import (
"fmt"
"golang.org/x/text/cases"
"golang.org/x/text/language"
"strings"
"testing"
)
func TestTitle4(t *testing.T) {
caser := cases.Title(language.English)
fmt.Println(caser.String("here comes o'brian"))
}
A saída é a seguinte:
Here Comes O'brian
Comparando strings.Title, pode-se ver que o "b" de "cérebro" é reconhecido com sucesso aqui e não está em maiúscula.
O tipo de retorno de cases.Title é a estrutura Caser, chame seu método String, este método recebe uma string e retorna uma string processada por Caser.