A rune típus a Go-ban az int32 álneve.
Mivel a mögöttes típusa int32, a rune típus egy előjeles 32 bites egész értéket tárol.
Az int32 típustól eltérően azonban a rune típusban tárolt egész érték egyetlen Unicode-karaktert ábrázol.
A Unicode az ASCII-t is magában foglalja, és úgy ábrázolja a karaktereket, hogy minden karakterhez egyedi számot rendel. Ezt az egyedi számot Unicode-kódpontnak nevezzük. A Unicode célja, hogy a világ összes karakterét Unicode-kódpontként ábrázolja, beleértve a különféle ábécéket, számokat, szimbólumokat és még az emojikat is.
A Go-ban a rune típus egyetlen Unicode-kódpontot ábrázol.
Az alábbi táblázat példákat mutat Unicode-karakterekre a Unicode-kódpontjukkal és a decimális értékükkel együtt:
| Unicode-karakter | Unicode-kódpont | Decimális érték |
|---|---|---|
| 0 | U+0030 |
48 |
| A | U+0041 |
65 |
| a | U+0061 |
97 |
| ¿ | U+00BF |
191 |
| π | U+03C0 |
960 |
| 🧠 | U+1F9E0 |
129504 |
A UTF-8 egy változó hosszúságú karakterkódolás, amely minden Unicode-kódpontot 1, 2, 3 vagy 4 bájtként kódol.
Mivel egy Unicode-kódpont legfeljebb 4 bájtként kódolható, a rune típusnak képesnek kell lennie legfeljebb 4 bájt adat tárolására.
Ezért a rune típus az int32 álneve, hiszen az int32 típus legfeljebb 4 bájt adatot képes tárolni.
A Go forráskódfájljai UTF-8-cal vannak kódolva.
A rune típusú változókat úgy deklarálod, hogy egy karaktert egyszeres idézőjelek közé teszel:
myRune := '¿'
Mivel a rune csupán az int32 álneve, ha kiírod egy rune típusát, int32-t kapsz:
myRune := '¿'
fmt.Printf("myRune type: %T\n", myRune)
// Output: myRune type: int32
Hasonlóképpen, ha kiírod egy rune értékét, annak egész (decimális) értékét kapod:
myRune := '¿'
fmt.Printf("myRune value: %v\n", myRune)
// Output: myRune value: 191
A rune által ábrázolt Unicode-karakter kiíratásához a %c formázási direktívát használd:
myRune := '¿'
fmt.Printf("myRune Unicode character: %c\n", myRune)
// Output: myRune Unicode character: ¿
A rune által ábrázolt Unicode-kódpont kiíratásához a %U formázási direktívát használd:
myRune := '¿'
fmt.Printf("myRune Unicode code point: %U\n", myRune)
// Output: myRune Unicode code point: U+00BF
A Go-ban a stringek UTF-8-cal vannak kódolva, ami azt jelenti, hogy Unicode-karaktereket tartalmaznak. A stringekben a karakterek 1, 2, 3 vagy 4 bájtként tárolódnak és kódolódnak, attól függően, hogy milyen Unicode-karaktert ábrázolnak.
A Go-ban a szeletek sorozatok ábrázolására szolgálnak, és ezeken a szeleteken a range segítségével lehet végigiterálni.
Amikor végigiterálunk egy stringen, a Go a stringet rune-ok sorozatává alakítja, amelyek mindegyike 4 bájt (ne feledd, a rune típus az int32 álneve!)
Bár egy string csupán bájtok szelete, a range kulcsszó egy string rune-jai felett iterál, nem a bájtjai felett.
Ebben a példában az index változó az aktuális rune bájtsorozatának kezdőindexét, a char változó pedig magát az aktuális rune-ot ábrázolja:
myString := "❗hello"
for index, char := range myString {
fmt.Printf("Index: %d\tCharacter: %c\t\tCode Point: %U\n", index, char, char)
}
// Output:
// Index: 0 Character: ❗ Code Point: U+2757
// Index: 3 Character: h Code Point: U+0068
// Index: 4 Character: e Code Point: U+0065
// Index: 5 Character: l Code Point: U+006C
// Index: 6 Character: l Code Point: U+006C
// Index: 7 Character: o Code Point: U+006F
Mivel a rune-ok 1, 2, 3 vagy 4 bájtként tárolhatók, egy string hossza nem mindig egyezik meg a benne lévő karakterek számával.
A beépített len függvénnyel egy string bájtban mért hosszát kapod meg, a utf8.RuneCountInString függvénnyel pedig egy string rune-jainak számát:
import "unicode/utf8"
myString := "❗hello"
stringLength := len(myString)
numberOfRunes := utf8.RuneCountInString(myString)
fmt.Printf("myString - Length: %d - Runes: %d\n", stringLength, numberOfRunes)
// Output: myString - Length: 8 - Runes: 6
Az a feladatod, hogy létrehozz egy naplókönyvtárat, amely segít a szervezeted naplóinak kezelésében. Ez a könyvtár lehetővé teszi a felhasználók számára, hogy azonosítsák, melyik alkalmazás bocsátotta ki az adott naplót, kijavítsák a sérült naplókat és meghatározzák, hogy egy adott naplósor egy bizonyos karakterkorláton belül van-e.
A naplók több alkalmazásból származnak, amelyek mindegyike saját, zárt naplóformátumot használ. Mielőtt egy naplót egy naplóaggregációs rendszerben tárolnánk, azonosítani kell, hogy melyik alkalmazás bocsátotta ki.
Készítsd el az Application függvényt, amely egy naplósort kap, és visszaadja azt az alkalmazást, amely a naplósort kibocsátotta.
Egy adott naplósort kibocsátó alkalmazás azonosításához keresd meg a naplósorban az alábbi táblázatban meghatározott karaktert:
| Alkalmazás | Karakter | Unicode-kódpont |
|---|---|---|
recommendation |
❗ | U+2757 |
search |
🔍 | U+1F50D |
weather |
☀ | U+2600 |
Ha egy naplósor nem tartalmazza a fenti táblázatban szereplő karakterek egyikét sem, add vissza a hívónak a default értéket.
Ha egy naplósor a fenti táblázatban szereplő karakterek közül egynél többet tartalmaz, add vissza a balról jobbra haladva elsőként megtalált karakterhez tartozó alkalmazást.
Application("❗ recommended search product 🔍")
// => recommendation
A naplózási infrastruktúrában előforduló ritka, de makacs hiba miatt bizonyos karakterek a naplókban megsérülhetnek. Miután időt töltöttél a sérült karakterek és eredeti értékük azonosításával, úgy döntesz, hogy frissíted a naplókönyvtárat, hogy segítsen a sérült naplók javításában.
Készítsd el a Replace függvényt, amely egy naplósort, egy sérült karaktert és az eredeti értéket kapja, és visszaad egy módosított naplósort, amelyben a sérült karakter minden előfordulása az eredeti értékre van cserélve.
log := "please replace '👎' with '👍'"
Replace(log, '👎', '👍')
// => please replace '👍' with '👍'"
A naplók megjelenítéséért felelős rendszereknek korlátja van arra, hogy naplósoronként hány karakter jeleníthető meg. Ezért a felhasználók azt kérik, hogy ez a könyvtár tartalmazzon egy segédfüggvényt annak meghatározására, hogy egy naplósor belefér-e egy adott karakterkorlátba.
Készítsd el a WithinLimit függvényt, amely egy naplósort és egy karakterkorlátot kap, és visszaadja, hogy a naplósor a karakterkorláton belül van-e.
WithinLimit("hello❗", 6)
// => true
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Go nyelvet 34 fogalom165 feladat segítségével, valódi emberi mentorálással, mindez ingyen.