strings.Fields în Go

Împarte textul în cuvinte după spații (oricâte, inclusiv tab și rând nou); FieldsFunc după o condiție a ta.

Sintaxă
func Fields(s string) []string
func FieldsFunc(s string, f func(rune) bool) []string

Ce face strings.Fields

strings.Fields(s) împarte textul în bucăți despărțite de spații albe: spațiu, tab (\t), rând nou (\n). Mai multe spații la rând contează ca unul singur, iar spațiile de la capete sunt ignorate, așa că nu apar niciodată bucăți goale.

strings.FieldsFunc(s, f) desparte textul acolo unde funcția f returnează true. Cu func(r rune) bool { return !unicode.IsLetter(r) } obții doar cuvintele, fără punctuație.

Diferența față de strings.Split: Split folosește un separator exact și păstrează bucățile goale; Fields este făcut pentru cuvinte.

Parametri

Parametru Descriere
s Textul de împărțit.
f La FieldsFunc: întoarce true pentru caracterele care despart cuvintele.

Ce returnează

Un slice []string cu bucățile (gol dacă textul are doar spații).

Exemple

Exemplul 1: Cuvintele unei propoziții

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := "  Ana   are\tmere\nși   pere  "
	cuvinte := strings.Fields(s)
	fmt.Printf("%q\n", cuvinte)
	fmt.Println("număr de cuvinte:", len(cuvinte))
	fmt.Printf("%q\n", strings.Fields("   "))
}

Rezultat

["Ana" "are" "mere" "și" "pere"]
număr de cuvinte: 5
[]

Exemplul 2: Doar cuvintele, fără punctuație

package main

import (
	"fmt"
	"strings"
	"unicode"
)

func main() {
	text := "Bună ziua! Ce faci, Ștefan? Totul e bine..."
	cuvinte := strings.FieldsFunc(text, func(r rune) bool {
		return !unicode.IsLetter(r)
	})
	fmt.Printf("%q\n", cuvinte)
}

Rezultat

["Bună" "ziua" "Ce" "faci" "Ștefan" "Totul" "e" "bine"]

Greșeli frecvente

  • Folosești strings.Split(s, " ") pentru cuvinte și primești bucăți goale la spațiile duble. Fields nu are această problemă.
  • Te aștepți ca Fields să scoată punctuația: „ziua!” rămâne cu semnul exclamării. Folosește FieldsFunc.

Comenzi înrudite

  • strings.Split: Împarte textul în bucăți după un separator exact; SplitN limitează numărul de bucăți, SplitAfter păstrează separatorul.
  • 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.
  • unicode.IsLetter: Verifică tipul unui caracter: literă, cifră, număr, spațiu alb sau semn de punctuație, după regulile Unicode.