Ich habe diese Frage vor einigen Monaten gestellt, als ich anfing, Go zu untersuchen. Seitdem habe ich jeden Tag über Go gelesen und in Go codiert.
Da ich auf diese Frage keine eindeutige Antwort erhalten habe (obwohl ich eine Antwort akzeptiert hatte), werde ich sie jetzt selbst beantworten, basierend auf dem, was ich gelernt habe, seit ich sie gestellt habe:
Gibt es eine Möglichkeit, ein Array / Slice in Go ohne eine fest codierte Arraygröße zu erstellen?
Ja. Für Slices ist kein fest codiertes Array erforderlich, um slice
von:
var sl []int = make([]int,len,cap)
Dieser Code sl
weist Slice len
mit einer Größe von cap
- len
und cap
Variablen zu, die zur Laufzeit zugewiesen werden können.
Warum wird list.List
ignoriert?
Es scheint, dass die Hauptgründe list.List
, die in Go wenig Beachtung finden, folgende sind:
Wie in der Antwort von @Nick Craig-Wood erläutert wurde, gibt es praktisch nichts, was mit Listen gemacht werden kann, die nicht mit Slices gemacht werden können, oft effizienter und mit einer saubereren, eleganteren Syntax. Zum Beispiel das Bereichskonstrukt:
for i:=range sl {
sl[i]=i
}
kann nicht mit list verwendet werden - ein C-Stil für die Schleife ist erforderlich. In vielen Fällen muss die Syntax des C ++ - Sammlungsstils für Listen verwendet werden:
push_back
usw.
Vielleicht noch wichtiger ist, dass list.List
es nicht stark typisiert ist - es ist Pythons Listen und Wörterbüchern sehr ähnlich, die es ermöglichen, verschiedene Typen in der Sammlung miteinander zu mischen. Dies scheint dem Go-Ansatz zu widersprechen. Go ist eine sehr stark typisierte Sprache - zum Beispiel müssen implizite Typkonvertierungen, die in Go niemals zulässig sind, selbst ein upCast von int
bis int64
muss explizit sein. Aber alle Methoden für list.List nehmen leere Schnittstellen - alles geht.
Einer der Gründe, warum ich Python aufgegeben und zu Go gewechselt habe, ist diese Art von Schwäche im Python-Typsystem, obwohl Python behauptet, "stark typisiert" zu sein (IMO ist es nicht). Go's list.List
scheint eine Art "Mischling" zu sein, der aus C ++ vector<T>
und Pythons geboren
List()
wurde und in Go selbst vielleicht etwas fehl am Platz ist.
Es würde mich nicht überraschen, wenn wir irgendwann in nicht allzu ferner Zukunft eine Liste finden. Die Liste in Go ist veraltet, obwohl sie möglicherweise bestehen bleibt, um den seltenen Situationen Rechnung zu tragen, in denen selbst mit guten Entwurfspraktiken ein Problem am besten gelöst werden kann mit einer Sammlung, die verschiedene Typen enthält. Oder vielleicht ist es da, um Entwicklern der C-Familie eine "Brücke" zu bieten, damit sie sich mit Go vertraut machen können, bevor sie die Nuancen von Slices kennenlernen, die nur für Go, AFAIK, gelten. (In mancher Hinsicht scheinen Slices Stream-Klassen in C ++ oder Delphi ähnlich zu sein, aber nicht vollständig.)
Obwohl ich aus einem Delphi / C ++ / Python-Hintergrund stamme, war ich bei meiner ersten Begegnung mit Go list.List
vertrauter als Go's Slices, da ich mich mit Go besser vertraut gemacht habe. Ich bin zurückgegangen und habe alle meine Listen in Slices geändert. Ich habe noch nichts gefunden slice
und / oder map
erlaube es mir nicht, so dass ich es verwenden muss list.List
.
list
Typ nicht mithilfe einer verknüpften Liste implementiert wird: Er verhält sich ähnlich wie ein Go-Slice und erfordert gelegentlich das Kopieren von Datenkopien.