Go:
Merkkijonon pituuden määrittäminen
Miten:
Go:ssa merkkijonoja kohdellaan muuttumattomina tavujonoina. Voit selvittää merkkijonon pituuden käyttämällä sisäänrakennettua len()
-funktiota, joka palauttaa tavujen lukumäärän, ei välttämättä merkkien lukumäärää. Näin sitä käytetään:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
// Käyttäen len() tavupituuden löytämiseksi
str := "Hello, 世界"
byteLength := len(str)
fmt.Println("Tavupituus:", byteLength) // Tuloste: Tavupituus: 13
// Hanki tarkka merkkien tai runejen lukumäärä merkkijonossa
runeLength := utf8.RuneCountInString(str)
fmt.Println("Rune-pituus:", runeLength) // Tuloste: Rune-pituus: 9
}
Ensimmäinen menetelmä len()
-funktion avulla ei aina anna odotettua tulosta, koska se laskee tavuja. Merkkijonoille, jotka sisältävät ei-ASCII-merkkejä (kuten “世界”), tulee käyttää unicode/utf8
-paketin RuneCountInString
-toimintoa, jotta voidaan laskea Unicode-koodipisteet tarkasti.
Syväsukellus
Ennen Go 1:stä, ei ollut tiukkaa rajanvetoa merkkijonojen käsittelyssä tavujonoina versus merkkijonoina. Post Go 1:ssä, UTF-8:n hyväksyminen merkkijonojen standardikoodausjärjestelmäksi vaati selkeämpiä lähestymistapoja. len()
-funktio toimii täydellisesti ASCII-merkkijonoille, joissa merkit esitetään yhdessä tavussa. Kuitenkin, kun Go-sovellukset tulivat globaalimmiksi ja tarve tukea lukuisia kieliä ja merkistöjä kasvoi, len()
-funktion yksinkertaisuuden rajoitukset tulivat näkyviin.
utf8.RuneCountInString()
-funktion käyttöönotto ja käyttö vastaavat näihin rajoituksiin tarjoamalla tavan laskea todelliset Unicode-merkit (rune Go-termistössä). Tämä menetelmä varmistaa, että pituuden laskenta on riippumaton UTF-8:n koodauksen erityispiirteistä, joissa merkit saattavat kattaa useita tavuja.
Vaihtoehtoinen lähestymistapa merkkijonojen käsittelyyn ja manipulointiin, joka on linjassa Go:n rinnakkaisuuden ja tehokkuuden eetoksen kanssa, saattaisi kohdella merkkijonoja rune-siivuina. Tämä menetelmä kuitenkin edellyttää muunnosvaihetta eikä se välittömästi ratkaise kaikkia Unicode:n monimutkaisuuksia (esim. yhdistävät merkit).
Yhteenvetona, kun len()
soveltuu tavupituuden mittaamiseen ja on tehokas ASCII-tekstille, utf8.RuneCountInString()
on luotettavampi valinta maailmanlaajuisesti yhteensopivaan sovellukseen. Kuitenkin kehittäjiä kannustetaan ymmärtämään näiden valintojen vaikutukset suorituskykyyn ja muistin käyttöön.