Stringjet

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
All Rights Reserved Theme by 404 THEME.