Tipuri de date
Toate datele care sunt stocate în memorie reprezintă, de fapt, un set de biți. Și anume, tipul de date determină modul în care aceste date vor fi interpretate și ce operații pot fi efectuate cu ele. Limbajul Go este un limbaj cu tipizare statică, ceea ce înseamnă că toate datele utilizate într-un program au un tip bine definit.
Go dispune de o serie de tipuri de date încorporate și, de asemenea, permite definirea propriilor tipuri. Să analizăm tipurile de date încorporate de bază pe care le putem utiliza.
Tipuri întregi
O serie de tipuri reprezintă numere întregi:
- int8: reprezintă un număr întreg de la -128 la 127 și ocupă 1 byte (8 biți) în memorie
- int16: reprezintă un număr întreg de la -32768 la 32767 și ocupă 2 bytes (16 biți)
- int32: reprezintă un număr întreg de la -2147483648 la 2147483647 și ocupă 4 bytes (32 biți)
- int64: reprezintă un număr întreg de la -9,223,372,036,854,775,808 la 9,223,372,036,854,775,807 și ocupă 8 bytes (64 biți)
- uint8: reprezintă un număr întreg de la 0 la 255 și ocupă 1 byte
- uint16: reprezintă un număr întreg de la 0 la 65535 și ocupă 2 bytes
- uint32: reprezintă un număr întreg de la 0 la 4294967295 și ocupă 4 bytes
- uint64: reprezintă un număr întreg de la 0 la 18,446,744,073,709,551,615 și ocupă 8 bytes
- byte: este un sinonim pentru tipul uint8, reprezintă un număr întreg de la 0 la 255 și ocupă 1 byte
- rune: este un sinonim pentru tipul int32, reprezintă un număr întreg de la -2147483648 la 2147483647 și ocupă 4 bytes
- int: reprezintă un număr întreg cu semn, care, în funcție de platformă, poate ocupa fie 4 bytes, fie 8 bytes. Adică poate corespunde fie tipului int32, fie tipului int64
- uint: reprezintă un număr întreg fără semn, care, similar tipului int, în funcție de platformă, poate ocupa fie 4 bytes, fie 8 bytes. Adică poate corespunde fie tipului uint32, fie tipului uint64
Este ușor de reținut că există tipuri cu semn (care pot fi negative) și tipuri fără semn (care sunt doar pozitive), care încep cu prefixul u (de exemplu, uint32). De asemenea, byte este un sinonim pentru uint8 și rune este un sinonim pentru int32.
Este important de menționat tipurile int și uint. Acestea au dimensiunea cea mai eficientă pentru platforma respectivă (32 sau 64 de biți). Acestea sunt cele mai utilizate tipuri pentru reprezentarea numerelor întregi într-un program. În plus, diferiți compilatori pot oferi dimensiuni diferite pentru aceste tipuri, chiar și pentru aceeași platformă.
Exemple de definire a variabilelor care reprezintă tipuri întregi:
var a int8 = -1
var b uint8 = 2
var c byte = 3 // byte - sinonim pentru uint8
var d int16 = -4
var f uint16 = 5
var g int32 = -6
var h rune = -7 // rune - sinonim pentru int32
var j uint32 = 8
var k int64 = -9
var l uint64 = 10
var m int = 102
var n uint = 105
Numere cu virgulă mobilă
Pentru reprezentarea numerelor fracționale există două tipuri:
- float32: reprezintă un număr cu virgulă mobilă între 1.410^-45 și 3.410^38 (pentru valorile pozitive). Ocupă 4 bytes (32 de biți)
- float64: reprezintă un număr cu virgulă mobilă între 4.910^-324 și 1.810^308 (pentru valorile pozitive) și ocupă 8 bytes
Tipul float32 oferă o precizie de 6 cifre zecimale, în timp ce tipul float64 oferă o precizie de aproximativ 15 cifre.
Exemple de utilizare a tipurilor float32 și float64:
var f float32 = 18
var g float32 = 4.5
var d float64 = 0.23
var pi float64 = 3.14
var e float64 = 2.7
Se utilizează punctul ca separator între partea întreagă și partea fracționară.
Numere complexe
Există tipuri separate pentru reprezentarea numerelor complexe:
- complex64: număr complex, unde partea reală și partea imaginară sunt numere float32
- complex128: număr complex, unde partea reală și partea imaginară sunt numere float64
Exemplu de utilizare:
var f complex64 = 1+2i
var g complex128 = 4+3i
Tipul bool
Tipul logic sau bool poate avea una dintre cele două valori: true (adevărat) sau false (fals).
var isAlive bool = true
var isEnabled bool = false
Șiruri de caractere
Șirurile de caractere sunt reprezentate de tipul string. În Go, un șir de caractere este un literal de șir — o secvență de caractere între ghilimele duble:
var name string = "Tom Sawyer"
Pe lângă caracterele obișnuite, un șir poate conține secvențe speciale (secvențe de control) care încep cu caracterul de backslash \. Cele mai comune secvențe sunt:
- \n: mutare pe linia următoare
- \r: întoarcerea la începutul liniei
- \t: tabulație
- \": ghilimea dublă în interiorul șirului
- \\: backslash
Valoarea implicită
Dacă unei variabile nu i se atribuie o valoare, aceasta va avea o valoare implicită, care este definită pentru tipul său. Pentru tipurile numerice, valoarea implicită este 0, pentru tipul logic este false, iar pentru șiruri este un șir gol "".
Tipizare implicită
La definirea unei variabile, putem omite tipul dacă o inițializăm explicit cu o valoare:
var name = "Tom"
În acest caz, compilatorul va deduce tipul variabilei pe baza valorii atribuite. Dacă se atribuie un șir, atunci variabila va avea tipul string, iar dacă se atribuie un număr întreg, atunci variabila va avea tipul int și așa mai departe.
Același lucru se întâmplă, de fapt, și la definirea scurtă a variabilelor, când tipul de date nu este specificat explicit:
name := "Tom"
Este important de reținut că, dacă nu specificăm tipul unei variabile, aceasta trebuie să aibă o valoare inițială atribuită. Definirea unei variabile fără tip și fără valoare inițială va genera o eroare:
var name // ! Eroare
Trebuie fie să specificăm tipul de date (în acest caz variabila va avea valoarea implicită):
var name string
Fie să specificăm valoarea inițială, iar tipul va fi dedus pe baza acesteia:
var name = "Tom"
Fie să specificăm ambele:
var name string = "Tom"
Tipizare implicită pentru mai multe variabile:
var (
name = "Tom"
age = 27
)
sau:
var name, age = "Tom", 27