Hice esta pregunta hace unos meses, cuando comencé a investigar Go. Desde entonces, todos los días he estado leyendo sobre Go y codificando en Go.
Debido a que no recibí una respuesta clara a esta pregunta (aunque había aceptado una respuesta), ahora la responderé yo mismo, basándome en lo que he aprendido, desde que la hice:
¿Hay alguna forma de crear una matriz / segmento en Go sin un tamaño de matriz codificado de forma rígida?
Si. Las rebanadas no requieren una matriz codificada slice
desde:
var sl []int = make([]int,len,cap)
Este código asigna un segmento sl
de tamaño len
con una capacidad de cap
- len
y cap
son variables que se pueden asignar en tiempo de ejecución.
¿Por qué se list.List
ignora?
Parece que las principales razones que list.List
parecen recibir poca atención en Go son:
Como se explicó en la respuesta de @Nick Craig-Wood, no hay prácticamente nada que se pueda hacer con listas que no se pueda hacer con porciones, a menudo de manera más eficiente y con una sintaxis más limpia y elegante. Por ejemplo, la construcción de rango:
for i:=range sl {
sl[i]=i
}
no se puede usar con la lista; se requiere un estilo C para el bucle. Y en muchos casos, la sintaxis de estilo de colección de C ++ debe usarse con listas:
push_back
etc.
Quizás lo más importante list.List
es que no está muy tipado, es muy similar a las listas y diccionarios de Python, que permiten mezclar varios tipos en la colección. Esto parece ir en contra del enfoque Go de las cosas. Go es un lenguaje muy tipado; por ejemplo, las conversiones de tipo implícitas nunca se permiten en Go, incluso un upCast de int
a int64
debe ser explícito. Pero todos los métodos para list.List toman interfaces vacías, todo vale.
Una de las razones por las que abandoné Python y me mudé a Go es por este tipo de debilidad en el sistema de tipos de Python, aunque Python afirma estar "fuertemente tipado" (IMO no lo es). Go's list.List
parece ser una especie de "mestizo", nacido de C ++ vector<T>
y Python
List()
, y quizás esté un poco fuera de lugar en Go.
No me sorprendería si en algún momento en un futuro no muy lejano, encontráramos list.List obsoleto en Go, aunque tal vez permanecerá, para dar cabida a esas situaciones raras donde, incluso utilizando buenas prácticas de diseño, un problema se puede resolver mejor con una colección que contiene varios tipos. O tal vez esté ahí para proporcionar un "puente" para que los desarrolladores de la familia C se sientan cómodos con Go antes de que aprendan los matices de los cortes, que son exclusivos de Go, AFAIK. (En algunos aspectos, los segmentos parecen similares a las clases de flujo en C ++ o Delphi, pero no del todo).
Aunque provengo de una experiencia en Delphi / C ++ / Python, en mi exposición inicial a Go encontré list.List
que era más familiar que los segmentos de Go, ya que me he sentido más cómodo con Go, volví y cambié todas mis listas a segmentos. Todavía no he encontrado nada que slice
y / o map
no me permita hacer, por lo que necesito usar list.List
.
list
tipo de Python no se implementa mediante una lista vinculada: se comporta de manera similar a un segmento de Go, y en ocasiones requiere que las copias de datos se expandan.