¿Cuál es la diferencia entre int e int64 en Go?
(4)
http://golang.org/pkg/strconv/#ParseInt
func ParseInt(s string, base int, bitSize int) (i int64, err error)
ParseInt interpreta una cadena s en la base dada (2 a 36) y devuelve el valor correspondiente i. Si base == 0, la base está implícita en el prefijo de la cadena: base 16 para "0x", base 8 para "0" y base 10 en caso contrario.
El argumento bitSize especifica el tipo de entero en el que debe encajar el resultado. Los tamaños de bit 0, 8, 16, 32 y 64 corresponden a int, int8, int16, int32 e int64.
Los errores que devuelve ParseInt tienen tipo concreto * NumError e incluyen err.Num = s. Si s está vacío o contiene dígitos no válidos, err.Err = ErrSyntax; si el valor correspondiente a s no se puede representar mediante un entero con signo del tamaño dado, err.Err = ErrRange.
ParseInt
siempre devuelve un valor int64
. Según bitSize
, este valor se ajustará a int
, int8
, int16
, int32
o int64
. Si el valor no puede ser representado por un entero con signo del tamaño dado por bitSize
, entonces err.Err = ErrRange
.
La especificación del lenguaje de programación Go
El valor de un entero de n bits es de n bits de ancho y se representa utilizando la aritmética de complemento de dos.
int8 the set of all signed 8-bit integers (-128 to 127) int16 the set of all signed 16-bit integers (-32768 to 32767) int32 the set of all signed 32-bit integers (-2147483648 to 2147483647) int64 the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
También hay un conjunto de tipos numéricos predeclarados con tamaños específicos de implementación:
uint either 32 or 64 bits int same size as uint
int
es 32 o 64 bits, dependiendo de la implementación. Normalmente son 32 bits para compiladores de 32 bits y 64 bits para compiladores de 64 bits.
Para averiguar el tamaño de un int
o uint
, use strconv.IntSize
.
const IntSize = intSize
IntSize
es el tamaño en bits de un valorint
uuint
.
Por ejemplo,
package main
import (
"fmt"
"runtime"
"strconv"
)
func main() {
fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)
fmt.Println(strconv.IntSize)
}
Salida:
gc amd64 linux
64
Tengo una cadena que contiene un entero (que se ha leído de un archivo).
Estoy tratando de convertir la string
a un int
usando strconv.ParseInt()
. ParseInt
requiere que proporcione un tamaño de bits (los tamaños de bit 0, 8, 16, 32 y 64 corresponden a int, int8, int16, int32 e int64).
El entero leído del archivo es pequeño (es decir, debe caber en una int normal). Sin embargo, si paso un tamaño de bits de 0, obtengo un resultado de tipo int64
(presumiblemente porque estoy ejecutando un sistema operativo de 64 bits).
¿Por qué está pasando esto? ¿Cómo obtengo una int normal? (Si alguien tiene una guía rápida sobre cuándo y por qué debería usar los diferentes tipos de int, ¡sería increíble!)
Editar: puedo convertir el int64 a un int normal usando int([i64_var])
. Pero todavía no entiendo por qué ParseInt()
me está dando un int64 cuando estoy solicitando un tamaño de bits de 0.
Para sus propósitos, Atoi sería más conveniente.
Las otras respuestas han sido bastante exhaustivas para explicar el tipo de int
, pero creo que un enlace a la especificación de idioma Go se merece aquí: http://golang.org/ref/spec#Numeric_types
strconv.ParseInt
y sus amigos devuelven versiones de 64 bits para mantener la API limpia y simple. El otro tendría que crear versiones separadas para cada posible tipo de devolución. O devuelve la interface{}
, que luego tendría que pasar por una aserción de tipo. Ninguno de los cuales es ideal.
Se elige int64
, porque puede contener cualquier tamaño entero hasta, e incluyendo, los 64 bits compatibles. El tamaño de bit que pasa a la función asegura que el valor esté correctamente ajustado al rango correcto. Entonces, simplemente puede hacer una conversión de tipo en el valor devuelto, para convertirlo en el tipo de entero que requiera.
En cuanto a la diferencia entre int
e int64
, esto depende de la arquitectura. int
es simplemente un alias para un entero de 32 bits o de 64 bits, según la arquitectura para la que esté compilando.
Para el ojo exigente: el valor devuelto es un entero con signo. Hay una función strconv.ParseUint
separada para enteros sin signo, que devuelve uint64
y sigue el mismo razonamiento explicado anteriormente.
func ParseInt(s string, base int, bitSize int) (i int64, err error)
ParseInt siempre devuelve int64
bitSize
define el rango de valores. Si el valor correspondiente a s no se puede representar mediante un entero con signo del tamaño dado, err.Err = ErrRange.
http://golang.org/pkg/strconv/#ParseInt
type int int
int es un tipo entero con signo que tiene al menos 32 bits de tamaño. Sin embargo, es un tipo distinto y no un alias para, digamos, int32.
http://golang.org/pkg/builtin/#int
Así que int
podría ser más grande que 32 bit en el futuro o en algunos sistemas como int
en C.
Supongo que en algunos sistemas int64
podría ser más rápido que int32
porque ese sistema solo funciona con enteros de 64 bits.
Aquí hay un ejemplo de error cuando bitSize
es 8
http://play.golang.org/p/_osjMqL6Nj
package main
import (
"fmt"
"strconv"
)
func main() {
i, err := strconv.ParseInt("123456", 10, 8)
fmt.Println(i, err)
}