


Warum kopiert „append(x, x...)' das Slice in ein neues Backing-Array in Go?
php-Editor Youzi wird eine häufig gestellte Frage für alle beantworten: Warum kopiert „append(x, x...)“ das Slice in das neue Support-Array in Go? In der Programmiersprache Go wird die Funktion „append“ verwendet, um Elemente an ein Slice anzuhängen. Wenn wir die Funktion „Anhängen“ verwenden und die Slice-Kapazität nicht ausreicht, erstellt Go ein neues zugrunde liegendes Array und kopiert die Elemente im ursprünglichen Slice in das neue zugrunde liegende Array. Dies liegt daran, dass in Go ein Slice ein Verweis auf ein dynamisches Array ist. Wenn die Slice-Kapazität nicht ausreicht, muss ein neues Array erstellt werden, um mehr Elemente aufzunehmen. Dieser Mechanismus stellt die Kontinuität und Skalierbarkeit von Slices sicher, bringt aber auch einige Leistungseinbußen mit sich.
Frageninhalt
Im Wiki mit Slicing-Tipps von go und in Go-Bibliotheken (wie in diesem Beispiel) wird manchmal Code wie der folgende zum Kopieren eines Slice in ein neues Backing-Array angezeigt.
// In a library at the end of a function perhaps... return append(whateverSlice[:0:0], whateverSlice...) // In an assignment, as in the wiki example... b = append(a[:0:0], a...)
Das glaube ich zu verstehen:
- Alle Elemente im Slice, die als zweites Argument für
append
angegeben werden, werden in das neue Hintergrundarray kopiert. - Im ersten Parameter von
append
的第一个参数中,代码使用完整切片表达式。 (我们可以将第一个参数重写为a[0:0:0]
,但如果省略,将提供第一个0
verwendet der Code einen vollständigen Slice-Ausdruck. (Wir könnten das erste Argument alsa[0:0:0]
umschreiben, aber wenn es weggelassen wird, wird das erste bereitgestellt. Ich glaube nicht, dass das für die größere Bedeutung hier relevant ist.) - Gemäß der Spezifikation sollte der generierte Slice vom gleichen Typ wie der ursprüngliche Slice sein und eine Länge und Kapazität von Null haben.
-
copy
代替append
(Wiederum nicht direkt verwandt, aber ich weiß, dass Siecopy
anstelle von verwenden können, und es liest sich sauberer.)
append(someslice[:0:0], someslice...)
创建一个新的支持数组。我最初也很困惑为什么 append
Allerdings verstehe ich immer noch nicht ganz, warum die Syntax append(someslice[:0:0], someslice...)
ein neues Backing-Array erstellt. Ich war anfangs auch verwirrt darüber, warum der
Jetzt meine Vermutung:
-
newslice := oldslice
Ich gehe davon aus, dass all dies notwendig und nützlich ist, denn wenn Sie nur zuweisen, werden sich Änderungen an dem einen im anderen widerspiegeln. Normalerweise möchte man das nicht. -
append
Da wir das Ergebnis von nicht dem Original-Slice zuweisen (was in go normal ist), passiert nichts mit dem Original-Slice. Es wird in keiner Weise gekürzt oder verändert. -
anyslice[:0:0]
的长度和容量均为零,因此如果 go 要将anyslice
Da die Elemente von dem Ergebnis zugeordnet sind, muss ein neues Backing-Array erstellt werden. Ist das der Grund , ein neues Backing-Array zu erstellen? -
anyslice...
没有元素会发生什么? go playground 上的一个片段表明,如果您在空切片上使用此附加技巧,则副本和原始副本最初具有相同的支持数组。 (编辑:正如评论者所解释的,我误解了这个片段。该片段显示这两个项目最初是相同的,但是都没有支持数组。它们都指向最初为通用零值。)由于两个切片的长度和容量都为零,因此当您向其中一个切片添加任何内容时,该切片将获得一个新的后备数组。所以我猜,效果还是一样的。即append
Was passiert, wennanyslice...
keine Elemente hat? Ein Snippet auf dem Go-Playground zeigt, dass, wenn Sie diesen zusätzlichen Trick auf ein leeres Slice anwenden, die Kopie und das Original zunächst das gleiche Backing-Array haben. (Bearbeiten: Wie ein Kommentator erklärte, habe ich diesen Ausschnitt falsch verstanden. Der Ausschnitt zeigt, dass die beiden Projekte ursprünglich gleich waren, aber keine Arrays unterstützen. Beide verweisen auf ein generisches ) Da beide Slices eine Länge und Kapazität von Null haben, erhält dieses Slice ein neues Backing-Array, wenn Sie etwas zu einem der Slices hinzufügen. Ich vermute also, dass der Effekt immer noch derselbe ist. Das heißt, die beiden Slices können sich nach dem Kopieren nicht gegenseitig beeinflussen. - Dieser andere Playground-Ausschnitt zeigt, dass die
append
-Kopiermethode sofort ein neues Backing-Array generiert, wenn das Slice mehr als null Elemente enthält. In diesem Fall werden die beiden resultierenden Slices sozusagen sofort getrennt.
Wahrscheinlich mache ich mir darüber zu viele Sorgen, aber ich hätte gerne eine ausführlichere Erklärung warum append(a[:0:0], a...)
der Trick einfach so funktioniert.
Problemumgehung
Da anySlice[:0:0] eine Länge und Kapazität von Null hat, muss Go ein neues Backing-Array erstellen, wenn es die Elemente von anySlice dem Ergebnis zuweisen möchte. Wurde deshalb das neue Backing-Array erstellt?
Denn die Kapazität ist 0
, ja.
https://pkg.go.dev/[email protected]#append
Wenn genügend Kapazität vorhanden ist, wird das Ziel neu aufgeteilt, um die neuen Elemente aufzunehmen. Wenn nicht, wird ein neues zugrunde liegendes Array zugewiesen.
-
cap=0
Nicht genug für nicht leere Slices, es muss ein neues Array zugewiesen werden.
Das obige ist der detaillierte Inhalt vonWarum kopiert „append(x, x...)' das Slice in ein neues Backing-Array in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

In dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

In dem Artikel werden die Verwaltungs -Go -Modulabhängigkeiten über Go.mod erörtert, die Spezifikationen, Aktualisierungen und Konfliktlösung abdecken. Es betont Best Practices wie semantische Versioning und reguläre Updates.

In dem Artikel werden mit Tabellensteuerungstests in GO eine Methode mit einer Tabelle mit Testfällen getestet, um Funktionen mit mehreren Eingaben und Ergebnissen zu testen. Es zeigt Vorteile wie eine verbesserte Lesbarkeit, verringerte Vervielfältigung, Skalierbarkeit, Konsistenz und a

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...
