una troficas trofica tipos redes productores hacer dibujo como cadenas cadena aves alimenticias alimenticia go variable-assignment

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.