strconv.ParseInt în Go

Citește un întreg dintr-un text, în orice bază (2–36) și verifică dacă încape într-un anumit număr de biți.

Sintaxă
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)

Ce face strconv.ParseInt

strconv.ParseInt(s, base, bitSize) este varianta completă a lui Atoi. base este baza de numerație: 10 pentru zecimal, 2 pentru binar, 16 pentru hexazecimal și orice valoare până la 36. Cu base = 0, baza se deduce din prefix: 0x (hexa), 0b (binar), 0o sau 0 (octal); doar în acest caz sunt permise și liniuțele de jos ca separator (1_000_000).

bitSize spune în ce tip trebuie să încapă rezultatul: 8, 16, 32, 64 sau 0 (pentru int). Rezultatul are mereu tipul int64, dar dacă valoarea nu încape în bitSize biți primești eroarea value out of range și cea mai apropiată valoare posibilă.

ParseUint este la fel, pentru numere fără semn (uint64): nu acceptă semnul minus.

Parametri

Parametru Descriere
s Textul cu numărul.
base Baza: 0 (după prefix) sau între 2 și 36.
bitSize Dimensiunea tipului țintă: 0, 8, 16, 32 sau 64.

Ce returnează

Numărul (int64, respectiv uint64) și eroarea (*strconv.NumError cu ErrSyntax sau ErrRange).

Exemple

Exemplul 1: Baze de numerație

package main

import (
	"fmt"
	"strconv"
)

func main() {
	a, _ := strconv.ParseInt("1010", 2, 64)
	b, _ := strconv.ParseInt("ff", 16, 64)
	c, _ := strconv.ParseInt("0x1F", 0, 64)
	d, _ := strconv.ParseInt("1_000_000", 0, 64)
	e, _ := strconv.ParseInt("-z", 36, 64)
	fmt.Println(a, b, c, d, e)
}

Rezultat

10 255 31 1000000 -35

Exemplul 2: Valori care nu încap

Un int8 ține valori între -128 și 127. La depășire primești eroare și valoarea maximă; conversia la int8 este apoi sigură.

package main

import (
	"errors"
	"fmt"
	"strconv"
)

func main() {
	n, err := strconv.ParseInt("300", 10, 8)
	fmt.Println(n, err)
	fmt.Println("depășire?", errors.Is(err, strconv.ErrRange))

	n, err = strconv.ParseInt("120", 10, 8)
	var mic int8 = int8(n)
	fmt.Println(mic, err)

	u, err := strconv.ParseUint("-5", 10, 64)
	fmt.Println(u, err)
}

Rezultat

127 strconv.ParseInt: parsing "300": value out of range
depășire? true
120 <nil>
0 strconv.ParseUint: parsing "-5": invalid syntax

Greșeli frecvente

  • Scrii ParseInt("0x1F", 16, 64). Cu baza 16 dată explicit, prefixul 0x nu este acceptat; folosește baza 0 sau scoate prefixul.
  • Convertești direct int8(n) fără să ceri bitSize 8. O valoare ca 300 se transformă tăcut în 44; cu bitSize corect primești eroare.

Comenzi înrudite

  • strconv.Atoi: Atoi transformă un text în număr întreg (int) și returnează eroare dacă nu se poate; Itoa face invers.
  • strconv.FormatInt: Transformă un întreg în text, în baza dorită (2–36): binar, octal, zecimal, hexazecimal.
  • strconv.ParseFloat: Citește un număr cu zecimale dintr-un text (cu punct, nu cu virgulă) ca float64.