strings.Split în Go

Împarte textul în bucăți după un separator exact; SplitN limitează numărul de bucăți, SplitAfter păstrează separatorul.

Sintaxă
func Split(s, sep string) []string
func SplitN(s, sep string, n int) []string
func SplitAfter(s, sep string) []string
func SplitAfterN(s, sep string, n int) []string

Ce face strings.Split

strings.Split(s, sep) taie textul la fiecare apariție a lui sep și returnează bucățile într-un slice. Separatorul nu apare în rezultat. Bucățile goale sunt păstrate: "a,,b" dă ["a" "" "b"]. Dacă sep este gol, textul este împărțit în caractere UTF-8.

SplitN(s, sep, n) returnează cel mult n bucăți; ultima conține tot restul textului, nedespărțit. Cu n = -1 se comportă ca Split, iar cu n = 0 returnează nil.

SplitAfter și SplitAfterN taie după separator și îl lasă la capătul fiecărei bucăți. Astfel, alipirea bucăților dă exact textul inițial.

Parametri

Parametru Descriere
s Textul de împărțit.
sep Separatorul exact, de exemplu ",", "; ", "\n".
n La SplitN și SplitAfterN: numărul maxim de bucăți (-1 = toate).

Ce returnează

Un slice []string. Pentru s gol și sep nenul: un slice cu o bucată goală, [""].

Exemple

Exemplul 1: Un rând CSV simplu

package main

import (
	"fmt"
	"strings"
)

func main() {
	rand := "Ana,Popescu,Iași,,10"
	campuri := strings.Split(rand, ",")
	fmt.Printf("%q\n", campuri)
	fmt.Println(len(campuri), "câmpuri; orașul:", campuri[2])

	fmt.Printf("%q\n", strings.Split("", ","))
	fmt.Printf("%q\n", strings.Split("Țară", ""))
}

Rezultat

["Ana" "Popescu" "Iași" "" "10"]
5 câmpuri; orașul: Iași
[""]
["Ț" "a" "r" "ă"]

Exemplul 2: SplitN: doar prima despărțire

Mesajul conține și el „: ”, dar cu n = 2 doar prima apariție desparte.

package main

import (
	"fmt"
	"strings"
)

func main() {
	linie := "Ana: Ne vedem la 18: 30 în Piața Unirii"
	parti := strings.SplitN(linie, ": ", 2)
	fmt.Printf("autor: %q\nmesaj: %q\n", parti[0], parti[1])
	fmt.Printf("%q\n", strings.Split(linie, ": "))
}

Rezultat

autor: "Ana"
mesaj: "Ne vedem la 18: 30 în Piața Unirii"
["Ana" "Ne vedem la 18" "30 în Piața Unirii"]

Exemplul 3: SplitAfter păstrează separatorul

package main

import (
	"fmt"
	"strings"
)

func main() {
	text := "Prima propoziție. A doua. A treia"
	parti := strings.SplitAfter(text, ". ")
	fmt.Printf("%q\n", parti)
	fmt.Println(strings.Join(parti, "") == text)
	fmt.Printf("%q\n", strings.SplitAfterN(text, ". ", 2))
}

Rezultat

["Prima propoziție. " "A doua. " "A treia"]
true
["Prima propoziție. " "A doua. A treia"]

Greșeli frecvente

  • Te aștepți ca Split("", ",") să dea un slice gol. Dă [""], cu lungime 1. Verifică textul gol înainte.
  • Folosești Split(s, " ") pentru cuvinte. Spațiile duble produc bucăți goale; folosește strings.Fields.
  • Accesezi parti[1] fără să verifici len(parti). Dacă separatorul lipsește, slice-ul are o singură bucată și programul se oprește cu index out of range. Pentru două părți, strings.Cut este mai sigur.
  • Desparți fișiere CSV reale cu Split. Câmpurile între ghilimele pot conține virgule; folosește pachetul encoding/csv.

Comenzi înrudite

  • strings.Fields: Împarte textul în cuvinte după spații (oricâte, inclusiv tab și rând nou); FieldsFunc după o condiție a ta.
  • strings.SplitSeq: Variantele iterator ale lui Split, SplitAfter, Fields și FieldsFunc, plus Lines: parcurgi bucățile cu for range, fără slice.
  • strings.Join: Lipește textele dintr-un slice într-un singur text, cu un separator între ele.
  • strings.Cut: Taie textul în două la prima (Cut) sau ultima (CutLast) apariție a separatorului și spune dacă l-a găsit.
  • regexp.Regexp.Split: Împarte textul în bucăți acolo unde se potrivește expresia regulată, de exemplu după orice combinație de virgule și spații.
  • bytes.Split: Split împarte un []byte după un separator în mai multe slice-uri; Join le lipește la loc cu un separator.