Një string është sekuencë karakteresh e gjatësisë së caktuar që përdoret për ruajtjen e tekstit. Go ofron suport për karakteret Unicode, me çka mundësohet përdorimi i shkronjave të alfabeteve të ndryshme si dhe shenjave të shumta speciale.
Një string vendoset ndërmjet thonjëzave apo shenjave backtick (`):
“Hello, World”
`Hello,
World`
Nëse stringu vendoset brenda thonjëzave, stringu nuk mund të përmbajë rreshta të rinj (newlines) ndërsa special escape sequences janë të lejuara.
Shenja \n
zëvendësohet me newline ndërsa \t
me tabulator.
Nëse stringu vendoset brenda backticks, stringun mund ta ndajmë në disa rreshta.
Karaktereve individuale të stringut mund t’iu qasemi sikur të ishte varg, duke përdorur indeksin, për aq kohë sa karakteret i takojnë tabelës ASCII.
package main
import (
"fmt"
)
func main() {
a := "Golang"
fmt.Println(a[0])
fmt.Println(string(a[0]))
}
https://play.golang.org/p/W8Fbgr2NLKK
Rezultati:
71
G
Si rezultat i fmt.Println(a[0])
fitohet kodi i karakterit të parë (indeksi 0) e që është 71
. Me anë të funksionit string()
mund ta konvertojmë në karakter (G).
Nëse një karakter e vendosim brenda apostrofave, vlerë e variablit do të jetë kodi i atij karakteri. Nëse një karakter e vendosim brenda thonjëzave, atëherë vlerë do të jetë karakteri.
package main
import (
"fmt"
)
func main() {
a := 'A'
b := "B"
fmt.Printf("%T %T \n", a, b)
fmt.Printf("%v %v \n", a, b)
fmt.Printf("%c %v", a, b)
}
https://play.golang.org/p/WL392-lPQ7w
Rezultati:
int32 string
65 B
A B
Pra, kur kemi deklaruar a := 'A'
, tipi i variablit a
do të jetë int32
, gjegjësisht rune
, që do të jetë një numër, pra 65
. Për ta printuar me fmt.Printf
, përdoret formatimi “%c”, ose e konvertojmë variablin me funksionin string()
:
fmt.Printf("%v %v", string(a), b)
Mund t’iu qasemi edhe një sekuence të karakterëve duke e cekur numrin e karakterëve të dëshiruar.
package main
import (
"fmt"
)
func main() {
a := "Golang"
fmt.Println(a[0:3])
}
https://play.golang.org/p/9I_gQlAwJw1
Rezultati:
Gol
Me a[0:3] kemi kërkuar 3 karakteret e njëpasnjëshëm duke filluar nga karakteri i parë [0], pastaj [1], pastaj [2], duke mos e përfshirë indeksin e fundit [3]. Në Go, kur ceket një diapazon i indekseve, nuk merret përfshihet indeksi i fundit, por përfshirja bëhet prej indeksit të cekur fillestar deri te ai i parafundit.
Vërejmë se në këtë rast fitojmë stringun “Gol” dhe jo kodet e karakterëve, pra nuk kemi nevojë të bëjmë konvertim eksplicit me funksionin string()
.
Karaktereve individualë mund t’iu qasemi edhe me strukturën for-range:
package main
import (
"fmt"
)
func main() {
a := "Golang"
// Mënyra 1
// i -> indeksi, a[i] -> kodi i karakterit, string(a[i]) -> karakteri
for i := range a {
fmt.Println(i, a[i], string(a[i]))
}
// Mënyra 2
// i -> indeksi, c -> kodi i karakterit, string(c) -> karakteri
for i, c := range a {
fmt.Println(i, c, string(c))
}
}
https://play.golang.org/p/shIDT8i9w4W
Rezultati:
0 71 G
1 111 o
2 108 l
3 97 a
4 110 n
5 103 g
0 71 G
1 111 o
2 108 l
3 97 a
4 110 n
5 103 g
Kur kemi të bëjmë me Unicod karaktere, ka dallim esencial ndërmjet përdorimit të strukturës for
dhe asaj for-range
për ekstaktimin e karaktereve. Struktura for
e zbërthen stringun bajt për bajt, ndërsa struktura for-range
do ta zbërthejë sipas Unicode karakterve.
Një Unicode karakter zë ndërmjet 1 dhe 4 bajtëve dhe përfshin pothuajse të gjitha alfabetet e botës. Karakteret nga tabela ASCII konsumojnë nga 1 bajt, kështu që për shembull për alfabetin e gjuhës angleze, si struktura for
si ajo for-range
do të japin rezultat të njëjtë. Mirëpo, në rastin e gjuhës kineze në shembullin vijues, 1 karakter zë 3 bajtë dhe struktura for
është e papërshtatshme për t’u përdorur për një string në gjuhën kineze. Në shembullin e mëposhtëm, zbërthimi i stringut në gjuhën kineze bëhet njëherë me for
, pastaj me for-range
.
package main
import (
"fmt"
)
func main() {
text := "新年快乐"
// bajt per bajt
for i := 0; i < len(text); i++ {
fmt.Println(string(text[i]))
}
// shkronje per shkronje
for _, v := range text {
fmt.Println(string(v))
}
}
https://play.golang.org/p/wRc_nHvLqKr
Rezultati:
æ
°
å
¹
´
å
¿
«
ä
¹
新
年
快
乐
Po ashtu, funksioni len()
për një string që përmban Unicode karaktere do të raportojë gjatësi të gabuar, sepse len()
tregon numrin e bajtëve, jo numrin e karaktereve. Një karakter ruhet si rune
, që është int32
. Pra, kur flasim për rune
, flasim për një hapësirë 32 bitëshe, respektivisht 4 bajtëshe, hapësire kjo e mjaftueshme për reprezentimin e të gjitha karaktereve të Unicode. Për ta llogaritur saktë numrin e karaktereve, do ta përdorim funksionin RuneCountInString()
nga pakoja utf8
.
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
fmt.Println(len("新年快乐"))
fmt.Println(utf8.RuneCountInString("新年快乐"))
}
https://play.golang.org/p/kJNEwwKKMHU
Rezultati:
12
4
Karakteristikë e stringjeve në Go është se janë immutable, gjegjësisht nuk mund t’iu ndryshohet përmbajtja, pra nuk mund ta ndryshojmë drejtpërsëdrejti ndonjë karakter apo sekuencë të karaktereve të stringut .
package main
import (
"fmt"
)
func main() {
a := "Golang"
fmt.Println(string(a[4]))
a[4] = "m"
}
https://play.golang.org/p/j1bLHKiHiQt
Rezultati:
./prog.go:11:7: cannot assign to a[4]
Pra, kur kemi tentuar ta ndryshojmë karakterin e pestë (indeksi 4), lajmërohet gabimi cannot assign to a[4]
.
Bashkangjitja e stringjeve (string concationation) kryhet me operatorin +.
package main
import (
"fmt"
)
func main() {
a := "Golang"
fmt.Println(a)
b := a + " programming"
fmt.Println(b)
b += " book"
fmt.Println(b)
}
https://play.golang.org/p/ZqRiAmTl7Mc
Rezultati:
Golang
Golang programming
Golang programming book
Në shembullin vijues është një program i thjeshtë i cili do ta shifruar një tekst duke e përdorur “Caesar cipher”, tek i cili bëhet zhvendosja e shkronjave për disa pozita ta zëmë djathtas kur shifrojmë, pastaj për po aq pozita majtas kur deshifrojmë.
Do ta përdorim kodin e karakterit që është numër i plotë për ta kryer operacionit të mbledhjes p.sh. me 3 (për zhvendosje 3 pozita djathtas), ndërsa gjatë dekodimit do ta kryejmë operacionin e zbritjes për zhvendosje majtas.
Programi është fare i thjeshtë dhe në këtë formë funksionin vetëm me ASCII karaktere.
package main
import (
"fmt"
)
func main() {
mesazhi := "ABCabcxyzXYZ"
fmt.Println("Origjinali: ", mesazhi)
koduar := ""
for i := 0; i < len(mesazhi); i++ {
koduar += string(mesazhi[i] + 3)
}
fmt.Println("Forma e koduar: ", koduar)
dekoduar := ""
for i := 0; i < len(koduar); i++ {
dekoduar += string(koduar[i] - 3)
}
fmt.Println("Dekoduar: ", dekoduar)
}
https://play.golang.org/p/tMwdc-NsN2R
Rezultati:
Origjinali: ABCabcxyzXYZ
Forma e koduar: DEFdef{|}[\]
Dekoduar: ABCabcxyzXYZ
Funksionet
len()
Tregon numrin e karaktereve që i përmban një string.
package main
import (
"fmt"
)
func main() {
a := "Golang"
fmt.Println(len(a))
}
https://play.golang.org/p/oUCmOQW7M5L
Rezultati:
6
string()
E konverton kodin e karakterit në karakter.
package main
import (
"fmt"
)
func main() {
a := "P"
fmt.Println(a[0])
fmt.Println(string(a[0]))
}
https://play.golang.org/p/G-gGIV08wU1
Rezultati:
80
P