tipuri de bază în Go

Tipurile simple din Go: bool, string, întregi cu și fără semn, numere reale, complexe, byte și rune.

Sintaxă
bool
string
int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr
byte  // = uint8
rune  // = int32, un caracter Unicode
float32 float64
complex64 complex128

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 + x cu n int și x 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 vet avertizează. Folosește strconv.Itoa.
  • int(2.99) nu rotunjește, ci taie: dă 2. Pentru rotunjire folosește math.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 &&, ||, !.