Menu

Strings en Golang: Split, Join, Contains, Replace y más

Trabajar con strings en Go: el paquete strings (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), construir strings de forma eficiente con strings.Builder, raw strings multilínea, inmutabilidad y por qué len cuenta bytes.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Un string de Go es una secuencia inmutable de bytes, normalmente texto UTF-8. Los operadores trabajan con el propio string (+, ==, <, indexar, recortar), y todo lo demás vive en el paquete estándar strings.

Dividir strings

FunciónDivide porNotas
Split(s, sep)cada sepconserva las partes vacías; Split("", ",") devuelve [""], un string vacío
SplitN(s, sep, n)como mucho n partesla última parte contiene el resto
SplitAfter(s, sep)cada sepconserva el separador en cada parte
Fields(s)secuencias de espacios en blanconunca devuelve partes vacías
FieldsFunc(s, f)caracteres donde f es trueseparadores propios
Cut(s, sep)solo el primer sepdevuelve antes, después y si lo encontró (Go 1.18)

El caso de Split("", ",") pilla a mucha gente: una entrada vacía da un slice de longitud 1, no 0. Al dividir la entrada del usuario, Fields o comprobar antes s == "" evita un elemento vacío fantasma.

strings.Cut es la forma más limpia de dividir pares como key=value o user@host. Go 1.24 añadió además versiones con iterador, strings.SplitSeq y strings.FieldsSeq, que producen las partes de una en una sin construir un slice.

Buscar

FunciónDevuelve
Contains(s, sub)true si sub aparece en s
ContainsAny(s, chars)true si aparece cualquier carácter de chars
HasPrefix(s, p) / HasSuffix(s, p)true si s empieza o termina por p
Index(s, sub)la posición en bytes de la primera coincidencia, o -1
LastIndex(s, sub)la posición en bytes de la última coincidencia, o -1
Count(s, sub)el número de coincidencias que no se solapan
EqualFold(a, b)igualdad sin distinguir mayúsculas y minúsculas

Todas las búsquedas distinguen mayúsculas y minúsculas salvo EqualFold. Para buscar sin distinguirlas, pasa los dos lados a minúsculas o usa EqualFold para comparar strings completos.

Transformar

Una trampa: Trim, TrimLeft y TrimRight reciben un conjunto de caracteres, no un prefijo. strings.TrimLeft("abcab", "ab") quita todas las a y b del principio y devuelve "cab". Para quitar un prefijo o un sufijo exactos, usa TrimPrefix y TrimSuffix.

Concatenación y strings.Builder

+ une strings, y fmt.Sprintf formatea valores en uno. Los dos reservan un string nuevo cada vez, porque los strings son inmutables. Está bien para un puñado de operaciones y es lento en un bucle, donde cada += copia todo lo construido hasta ese momento. Usa strings.Builder:

Un strings.Builder a cero está listo para usar. Implementa io.Writer, así que fmt.Fprintf escribe directamente en él. Llama antes a b.Grow(n) si sabes más o menos lo grande que será el resultado. No copies un Builder después de escribir en él; pasa un puntero.

Strings multilínea y raw strings

Go tiene dos tipos de literal de string:

Los strings entre comillas dobles procesan escapes (\n, \t, \", \\, \u00e9) y tienen que caber en una línea. Los raw strings entre comillas invertidas lo toman todo literalmente, incluidos los saltos de línea, lo que los convierte en la forma de escribir strings multilínea, expresiones regulares, JSON y rutas de Windows. Un raw string no puede contener una comilla invertida, y los retornos de carro que haya dentro se descartan. Fíjate en que la consulta de arriba empieza con un salto de línea, porque el literal empieza justo después de la comilla invertida de apertura.

Longitud, índices y substrings

len(s) es el número de bytes. s[i] es un byte, y s[i:j] es un substring por posiciones en bytes:

ï y é ocupan dos bytes cada una, así que el string tiene 12 bytes y 10 caracteres. Recortar por bytes es seguro siempre que las posiciones vengan de strings.Index o funciones parecidas, que devuelven desplazamientos en bytes en los límites de los caracteres. Para tomar "los primeros n caracteres", convierte antes a []rune. La página de runes y bytes explica UTF-8 a fondo.

Los strings son inmutables

No puedes cambiar un byte en el sitio: s[0] = 'H' es un error de compilación (cannot assign to s[0] (neither addressable nor a map index expression)). Cada función de strings devuelve un string nuevo. Para editar, convierte a []byte o []rune, cambia el slice y vuelve a convertir:

b := []byte("hello")
b[0] = 'H'
s := string(b) // "Hello"

La inmutabilidad es también la razón de que los substrings sean baratos: s[2:5] comparte memoria con s en lugar de copiarla. La otra cara es que un substring pequeño de un string enorme mantiene vivo el string enorme entero. Usa strings.Clone (Go 1.20) cuando te quedes con un trozo corto de una entrada grande.

Comparar strings

== y != comparan el contenido, y < y > comparan byte a byte, lo que equivale al orden alfabético en ASCII. strings.Compare existe pero rara vez hace falta; slices.Sort sobre un []string usa <. Para ordenar texto en otros idiomas respetando sus reglas, usa golang.org/x/text/collate.

Convertir otros tipos

Los números se convierten en strings con strconv.Itoa, strconv.FormatFloat o fmt.Sprintf, y los strings en números con strconv.Atoi y strconv.ParseFloat. No escribas string(42): produce el carácter con code point 42, "*". La página de conversión de tipos tiene la tabla completa.

Preguntas frecuentes

¿Cómo divido un string en Go?

Usa strings.Split(s, sep): strings.Split("a,b,c", ",") devuelve ["a" "b" "c"]. Para dividir por cualquier secuencia de espacios en blanco y descartar las partes vacías, usa strings.Fields(s). strings.SplitN limita el número de partes, y strings.Cut divide una vez alrededor del primer separador.

¿Cómo escribo un string de varias líneas en Go?

Usa un literal raw string entre comillas invertidas:

query := `SELECT id, name
FROM users
WHERE active = true`

Todo lo que hay entre las comillas invertidas se toma literalmente, incluidos los saltos de línea y las barras invertidas. Un raw string no puede contener una comilla invertida.

¿Cómo compruebo si un string contiene un substring en Go?

strings.Contains(s, substr) devuelve un bool. Funciones relacionadas: strings.HasPrefix, strings.HasSuffix, strings.Index (la posición o -1), strings.ContainsAny (cualquiera de un conjunto de caracteres) y strings.EqualFold para la igualdad sin distinguir mayúsculas y minúsculas.

¿Cuál es la forma más rápida de concatenar strings en Go?

Para unos pocos strings, + está bien. Cuando construyas un string en un bucle, usa strings.Builder: llama a WriteString repetidamente y a String() una vez al final. Un += repetido en un bucle copia el string entero cada vez, así que se vuelve lento a medida que el string crece. Para unir un slice con un separador, usa strings.Join.

¿Por qué len devuelve una longitud incorrecta para mi string?

len(s) devuelve el número de bytes, no de caracteres. Los strings de Go son UTF-8, donde los caracteres fuera de ASCII ocupan de 2 a 4 bytes, así que len("héllo") vale 6. Usa utf8.RuneCountInString(s) para obtener el número de code points Unicode.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR