Ce face tipuri de bază
Go are un set mic de tipuri de bază: bool (true/false), string (text UTF-8, nemodificabil), întregii cu semn int8…int64 și fără semn uint8…uint64, numerele reale float32 și float64 și numerele complexe complex64 și complex128. int și uint au 64 de biți pe calculatoarele actuale.
Pentru început, alegerea este simplă: int pentru numere întregi, float64 pentru numere cu zecimale, string pentru text și bool pentru condiții. Tipurile cu dimensiune fixă (int32, uint8) se folosesc la formate binare, protocoale sau când memoria contează. byte este alt nume pentru uint8 (un octet), iar rune pentru int32 (un caracter Unicode).
Go nu face conversii automate între tipuri numerice: int plus float64 nu compilează. Conversia se scrie explicit, cu numele tipului: float64(n), int(x) (taie zecimalele), int64(n). Între numere și text se convertește cu pachetul strconv, nu cu string(n).
Exemple
Exemplul 1: Tipurile de bază și conversiile
%T afișează tipul, %v valoarea.
package main
import (
"fmt"
"strconv"
)
func main() {
var activ bool = true
var oras string = "Iași"
var elevi int = 28
var medie float64 = 8.75
var litera rune = 'ș'
var octet byte = 'A'
fmt.Printf("%T %v\n%T %v\n%T %v\n%T %v\n", activ, activ, oras, oras, elevi, elevi, medie, medie)
fmt.Printf("%T %v (%c)\n%T %v (%c)\n", litera, litera, litera, octet, octet, octet)
total := float64(elevi) * medie // conversie explicită
fmt.Println("total puncte:", total)
fmt.Println("parte întreagă:", int(medie))
fmt.Println("ca text:", strconv.Itoa(elevi)+" elevi")
}
Rezultat
bool true
string Iași
int 28
float64 8.75
int32 537 (ș)
uint8 65 (A)
total puncte: 245
parte întreagă: 8
ca text: 28 elevi
Exemplul 2: Limitele tipurilor întregi
Constantele din pachetul math dau valorile minime și maxime.
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println("int8: ", math.MinInt8, "..", math.MaxInt8)
fmt.Println("uint8: ", 0, "..", math.MaxUint8)
fmt.Println("int32: ", math.MinInt32, "..", math.MaxInt32)
fmt.Println("int64: ", math.MinInt64, "..", math.MaxInt64)
fmt.Println("float64 maxim:", math.MaxFloat64)
}
Rezultat
int8: -128 .. 127
uint8: 0 .. 255
int32: -2147483648 .. 2147483647
int64: -9223372036854775808 .. 9223372036854775807
float64 maxim: 1.7976931348623157e+308
Greșeli frecvente
n + xcun intșix float64:invalid operation: n + x (mismatched types int and float64). Convertește unul dintre ele.string(65)dă"A"(caracterul cu codul 65), nu"65";go vetavertizează. Foloseștestrconv.Itoa.int(2.99)nu rotunjește, ci taie: dă 2. Pentru rotunjire foloseștemath.Round.
Comenzi înrudite
int, int8…int64, uint, uint8…uint64, uintptr: Tipurile întregi din Go: cu semn (int, int8..int64) și fără semn (uint, uint8..uint64, uintptr), cu limitele lor.float32 și float64: Numere reale în virgulă mobilă: float64 (precizie dublă, tipul implicit) și float32 (precizie simplă).string: Tipul pentru texte: o secvență de octeți nemodificabilă, de obicei UTF-8; se concatenează cu + și se compară cu ==.string-uri, rune și byte: Textul în Go este UTF-8: len dă octeți, range dă rune (caractere), byte este un octet, rune un caracter.zero values (valori zero): Orice variabilă fără valoare inițială primește valoarea zero a tipului: 0, „”, false sau nil.bool, true și false: Tipul logic: are doar valorile true și false; rezultatul comparațiilor și al operatorilor &&, ||, !.