Å finne lengden på en streng

Go:
Å finne lengden på en streng

Hvordan gjøre det:

I Go behandles strenger som uforanderlige sekvenser av bytes. Du kan finne lengden på en streng ved hjelp av den innebygde len()-funksjonen som returnerer antall bytes, ikke nødvendigvis antall tegn. Slik bruker du den:

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	// Bruker len() for å finne byte-lengden
	str := "Hello, 世界"
	byteLength := len(str)
	fmt.Println("Byte Lengde:", byteLength) // Utdata: Byte Lengde: 13

	// For å nøyaktig få antall tegn eller runer i en streng
	runeLength := utf8.RuneCountInString(str)
	fmt.Println("Rune Lengde:", runeLength) // Utdata: Rune Lengde: 9
}

Den første metoden ved bruk av len() gir ikke alltid det forventede resultatet siden den teller bytes. For strenger som inneholder ikke-ASCII-tegn (som “世界”), bør RuneCountInString fra unicode/utf8-pakken brukes i stedet for å nøyaktig telle Unicode-kodepunkter.

Dypdykk

Før Go 1 var det ingen streng demarkasjon for behandling av strenger som sekvenser av bytes versus sekvenser av tegn. Etter Go 1, med adopsjonen av UTF-8 som standard tegnkodingsordning for strenger, ble det nødvendig med klarere tilnærminger. len()-funksjonen fungerer perfekt for ASCII-strenger, der tegn er representert i en enkel byte. Imidlertid, ettersom Go-applikasjoner ble mer globale, og behovet for å støtte en mengde språk og tegnsett vokste, viste den enkle tilnærmingen av len() begrensninger.

Introduksjonen og bruk av utf8.RuneCountInString() svarer på disse begrensningene ved å tilby en måte å telle faktiske Unicode-tegn (runer i Go-terminologi) på. Denne metoden sikrer at lengdeberegningen er uavhengig av kodningsspesifikkene til UTF-8, der tegn kan spenne over flere bytes.

Et alternativt tilnærming for å traversere og manipulere strenger, mer i tråd med Go’s etos for samtidighet og effektivitet, kan innebære å behandle strenger som skiver av runer. Imidlertid krever denne metoden et konverteringstrinn og løser ikke øyeblikkelig alle finessene ved Unicode (f.eks. kombinerende tegn).

Oppsummert, mens len() er egnet for byte-lengde og er effektiv for ASCII-tekst, er utf8.RuneCountInString() et mer pålitelig valg for en globalt kompatibel applikasjon. Likevel oppfordres utviklere til å forstå avveiningene i ytelse og minnebruk som disse valgene medfører.