Inhaltsverzeichnis
Frageninhalt
Problemumgehung
Heim Backend-Entwicklung Golang Warum kopiert „append(x, x...)' das Slice in ein neues Backing-Array in Go?

Warum kopiert „append(x, x...)' das Slice in ein neues Backing-Array in Go?

Feb 10, 2024 am 11:12 AM

为什么 `append(x, x...)` 将切片复制到 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...)
Nach dem Login kopieren

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 als a[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 Sie copy anstelle von
  • verwenden können, und es liest sich sauberer.)

append(someslice[:0:0], someslice...) 创建一个新的支持数组。我最初也很困惑为什么 appendAllerdings 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

-Vorgang das ursprüngliche Slice nicht durcheinander gebracht (oder abgeschnitten) hat.

Jetzt meine Vermutung:
  • newslice := oldsliceIch 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.
  • appendDa 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 要将 anysliceDa 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 上的一个片段表明,如果您在空切片上使用此附加技巧,则副本和原始副本最初具有相同的支持数组。 (编辑:正如评论者所解释的,我误解了这个片段。该片段显示这两个项目最初是相同的,但是都没有支持数组。它们都指向最初为通用零值。)由于两个切片的长度和容量都为零,因此当您向其中一个切片添加任何内容时,该切片将获得一个新的后备数组。所以我猜,效果还是一样的。即appendWas passiert, wenn anyslice... 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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Schwachstellen von Debian Openensl Was sind die Schwachstellen von Debian Openensl Apr 02, 2025 am 07:30 AM

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.

Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Mar 21, 2025 pm 06:37 PM

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

Wie schreibt man Unit -Tests in Go? Wie schreibt man Unit -Tests in Go? Mar 21, 2025 pm 06:34 PM

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

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

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

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

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. � ...

Wie geben Sie Abhängigkeiten in Ihrer Go.Mod -Datei an? Wie geben Sie Abhängigkeiten in Ihrer Go.Mod -Datei an? Mar 27, 2025 pm 07:14 PM

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.

Wie verwenden Sie tabelgesteuerte Tests in Go? Wie verwenden Sie tabelgesteuerte Tests in Go? Mar 21, 2025 pm 06:35 PM

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

Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Apr 02, 2025 am 09:12 AM

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, ...

See all articles