Wie kann ich (kurz und bündig) entfernen des ersten Elements aus einem slice in Go?
Hab ich baute eine einfache Warteschlange Gehen. Es verwendet einen internen Scheibe zu verfolgen seine Elemente. Elemente geschoben werden, in die Warteschlange, durch Anhängen an die Scheibe. Ich würde gerne umsetzen .Pop()
durch entfernen des ersten Elements in elements
.
In vielen anderen Sprachen, "popping" das erste element einer Liste ist ein one-liner, die führt mich zu glauben, meine Implementierung unten ist schlampig und ausführlich. Gibt es einen besseren Weg?
type Queue struct {
elements []interface{}
}
func (queue *Queue) Push(element interface{}) {
queue.elements = append(queue.elements, element)
}
func (queue *Queue) Pop() interface{} {
element := queue.elements[0]
if len(queue.elements) > 1 {
queue.elements = queue.elements[1:]
} else {
queue.elements = make([]interface{}, 0)
}
return element
}
Bitte beachten Sie, dass Wünsche ich für die Queue
zu Panik, wenn len(queue.elements) == 0
. Es ist nicht ein versehen, dass ich nicht überprüfen Sie die Grenzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, diese?
Pop aus der Warteschlange
Pop vom stack
Push
Aus: https://code.google.com/p/go-wiki/wiki/SliceTricks
Wenn Sie möchten, dass ein Ringspeicher oder FIFO-Struktur, die dann mit einer Scheibe wie in @Everton Antwort verursachen garbage collection Probleme wie die zugrunde liegende array kann unendlich groß werden.
Der einfachste Weg, dies zu tun in gehen, vorausgesetzt, Sie nichts dagegen haben, dass eine begrenzte Größe, mit einem channel, der auch sicher für den gleichzeitigen Zugriff. Das ist wie ein gemeinsames idiom zu gehen, die Sie würde nicht normalerweise stören, wickelte Sie in eine Art wie die unten.
Eg (Spielplatz)
Pop
) ist auch versucht, zu rufenPush
eine Sackgasse kann auftreten. @Everton ' s Ansatz ist es nicht, diesen Nachteil; die garbage-collection-problem gelöst werden könnte, einen anderen Weg.select
imPush
Methode.