troficas - ¿Por qué una cadena no puede ser nula en Go?
red trofica (3)
El programa disponible en The Go Playground lee.
package main
import "fmt"
func main() {
var name string = nil
fmt.Println(name)
}
y produce un error
prog.go:6: cannot use nil as type string in assignment
Entiendo que ""
es el "valor cero" para las cadenas . No entiendo por qué no puedo asignar nil
a mi string
.
Aedolon hizo algunos buenos puntos, pero para ir más lejos, en otros idiomas, las cadenas son formas convenientes de representar arrays de bytes como caracteres. Tenemos que hacer esto mucho, por lo que este caso de uso específico de una matriz recibe una gran cantidad de soporte de idiomas para que sea más fácil de usar. Sin embargo, en el fondo del asunto, está trabajando con una matriz, que a menudo puede ser nula en un idioma porque es un tipo de referencia. Es decir, la cadena no es realmente nula, el puntero a la matriz es nulo. Debido a que muchos lenguajes combinan estas dos cosas, los programadores están acostumbrados a tener que verificar si una cadena es nula antes de usarla.
Ir no hace esto. Una cadena no puede ser nula, porque la estructura de datos en go no lo permite. Puede tener un puntero a una matriz de bytes que contenga las representaciones de caracteres en null, pero eso no es una cadena.
In string
es un tipo de datos, no es un puntero a una matriz como C / C ++. Como tal, no puedes asignarlo a nil.
La respuesta simple es que nil
no se define como un valor válido para la string
tipo en la especificación de idioma .
... pero tal vez quieres una respuesta más larga?
nil
es el valor cero para los punteros, interfaces, canales, segmentos, mapas y tipos de funciones, y representa un estado sin inicializar .
Considere las siguientes declaraciones de variables:
var a *SomeType
var b interface{}
var c func()
Parece natural que todas estas variables tengan un valor que represente un estado sin inicializar. a
ha sido declarado como un puntero, pero ¿a qué apuntaría cuando todavía no lo hemos apuntado a nada? nil
es un valor cero obvio para estos tipos.
En cuanto a los canales, segmentos y mapas, su valor cero es nil
por la sencilla razón de que su implementación es tal que deben inicializarse explícitamente antes de poder utilizarlos. Esto se debe principalmente a razones de rendimiento, todos estos tipos se representan internamente como estructuras de datos más o menos complejas, y su inicialización no es gratis.
Sin embargo, una string
no requiere inicialización, y parece natural que el valor predeterminado, cero para una nueva variable de cadena, sea una cadena vacía, ""
. Por lo tanto, simplemente no hay razón para que nil
sea un valor de cadena válido, y agregarlo a la especificación solo haría que el lenguaje sea más complicado y mucho más complicado trabajar con él.
Además, ¿qué representaría nil
de tipo string
? ¿Una cuerda vacía? Ya tenemos eso. ¿Una cuerda sin inicializar? No hay tal cosa.