2013-11-27 10 views

Antwort

23

Es macht einen ziemlich großen Unterschied: Der Unterschied ist zwischen einem array und einem slice.

[]string erstellt ein Segment, das auf ein Array von Strings zeigt. Auf der anderen Seite erzeugt [...] ein tatsächliches Array von Strings.

Es gibt eine große blog post über den Unterschied zwischen den beiden auf dem Golang-Blog. Ich werde versuchen, hier so gut wie möglich zusammenzufassen.

Arrays in Golang sind wie Werttypen, sie sind Verweise auf einen bestimmten Typ und haben immer eine bestimmte Länge. Es gibt zwei Möglichkeiten, um ein Array zu erzeugen: 1) mit expliziter Länge und 2) implizites Länge:

// Explicit length. 
var days := [7]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

// Implicit length. (Let the compiler figure it out how long it is) 
var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

Diese sind beide äquivalent Array Definitionen. Beachten Sie, dass die Länge eines Arrays Teil seiner Typdefinition ist. Also, Sie nicht Austausch Arrays ähnlicher Art mit unterschiedlichen Längen:

// These two are not interchangeable! 
var someArray [5]string; 
var otherArray [10]string; 

func work(data [5]string) { /* ... */ } 

work(someArray) // good 
work(otherArray) // not so good 

Beachten Sie auch, dass Arrays, wie structs, werden als Wert übergeben – eine Kopie des Arrays an eine Funktion gegeben werden, nicht ein Hinweis darauf.

Scheiben sind auf der anderen Seite wie Referenztypen. Sie werden von einem Array unterstützt, sind aber flexibler. Sie enthalten einen Zeiger auf eine Position innerhalb des Arrays, eine Länge und eine Kapazität.

// Create a slice 
var days := []string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

Scheiben, im Gegensatz zu Anordnungen, die nicht explizit in ihrer Länge gebunden und Scheiben von unterschiedlicher Länge können für einen anderen übergeben werden. Sie verhalten sich auch eher wie ein Zeiger, was bedeutet, dass sie durch Referenz anstelle von Wert übergeben werden.

Es gibt auch eine große Post über Go Data Structures, und wie sie sind sie im Speicher vertreten sind. Ich empfehle dringend, es auszuprobieren.

+1

Ich denke, dass Sie 'someArray' und' OtherArray' Längen in Ihrem zweiten Beispiel austauschen sollten :) –

+0

@VladimirMatveev guten Fang :) –

Verwandte Themen