Goroutinen und Kan?le in Golang mit intuitiven Bildern verstehen
Dec 30, 2024 pm 04:18 PM1. Führen Sie jedes Beispiel aus: Lesen Sie nicht nur den Code. Geben Sie es ein, führen Sie es aus und beobachten Sie das Verhalten.?? Wie geht man bei dieser Serie vor?
2. Experimentieren Sie und machen Sie Dinge kaputt: Entfernen Sie Schlafphasen und sehen Sie, was passiert, ?ndern Sie die Kanalpuffergr??en, ?ndern Sie die Anzahl der Goroutinen.
Wenn man Dinge kaputt macht, lernt man, wie sie funktionieren
3. Grund für das Verhalten: Bevor Sie ge?nderten Code ausführen, versuchen Sie, das Ergebnis vorherzusagen. Wenn Sie unerwartetes Verhalten bemerken, halten Sie inne und überlegen Sie, warum. Stellen Sie die Erkl?rungen in Frage.
4. Erstellen Sie mentale Modelle: Jede Visualisierung repr?sentiert ein Konzept. Versuchen Sie, Ihre eigenen Diagramme für ge?nderten Code zu zeichnen.
Dies ist Teil 1 unserer Serie ?Mastering Go Concurrency“, in der wir Folgendes behandeln:
- Wie Goroutinen funktionieren und ihr Lebenszyklus
- Kanalkommunikation zwischen Goroutinen
- Gepufferte Kan?le und ihre Anwendungsf?lle
- Praxisbeispiele und Visualisierungen
Wir beginnen mit den Grundlagen und entwickeln schrittweise ein Gespür dafür, wie wir diese effektiv nutzen k?nnen.
Es wird etwas lang, eher sehr lang, also macht euch bereit.
Wir stehen Ihnen w?hrend des gesamten Prozesses zur Seite.
Grundlagen von Goroutinen
Beginnen wir mit einem einfachen Programm, das mehrere Dateien herunterl?dt.
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") startTime := time.Now() downloadFile("file1.txt") downloadFile("file2.txt") downloadFile("file3.txt") elapsedTime := time.Since(startTime) fmt.Printf("All downloads completed! Time elapsed: %s\n", elapsedTime) }
Das Programm dauert insgesamt 6 Sekunden, da jeder 2-sekündige Download abgeschlossen sein muss, bevor der n?chste beginnt. Stellen wir uns das vor:
Wir k?nnen diese Zeit verkürzen, indem wir unser Programm so ?ndern, dass es Go-Routinen verwendet:
Hinweis: Schlüsselwort vor Funktionsaufruf eingeben
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") // Launch downloads concurrently go downloadFile("file1.txt") go downloadFile("file2.txt") go downloadFile("file3.txt") fmt.Println("All downloads completed!") }
Warte was? wurde nichts gedruckt? Warum?
Lassen Sie uns dies visualisieren, um zu verstehen, was passieren k?nnte.
Aus der obigen Visualisierung gehen wir hervor, dass die Hauptfunktion existiert, bevor die Goroutinen fertig sind. Eine Beobachtung ist, dass der gesamte Lebenszyklus einer Goroutine von der Hauptfunktion abh?ngt.
Hinweis: Die Hauptfunktion an sich ist eine Goroutine ;)
Um dies zu beheben, müssen wir die Haupt-Goroutine warten lassen, bis die anderen Goroutinen abgeschlossen sind. Dafür gibt es mehrere M?glichkeiten:
- Warten Sie ein paar Sekunden (knifflige Art)
- WaitGroup verwenden (richtige Vorgehensweise, als n?chstes)
- Verwendung von Kan?len (wir werden weiter unten darauf eingehen)
Lassen Sie uns einige Sekunden warten, bis die Go-Routinen abgeschlossen sind.
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") startTime := time.Now() downloadFile("file1.txt") downloadFile("file2.txt") downloadFile("file3.txt") elapsedTime := time.Since(startTime) fmt.Printf("All downloads completed! Time elapsed: %s\n", elapsedTime) }
Das Problem dabei ist, dass wir m?glicherweise nicht wissen, wie viel Zeit eine Goroutine dauern k?nnte. In diesem Fall haben wir jeweils eine konstante Zeit, aber in realen Szenarien sind wir uns bewusst, dass die Downloadzeit variiert.
Kommt die sync.WaitGroup
Eine sync.WaitGroup in Go ist ein Parallelit?tskontrollmechanismus, der verwendet wird, um darauf zu warten, dass die Ausführung einer Sammlung von Goroutinen abgeschlossen ist.
Hier sehen wir uns das in Aktion an und visualisieren es:
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") // Launch downloads concurrently go downloadFile("file1.txt") go downloadFile("file2.txt") go downloadFile("file3.txt") fmt.Println("All downloads completed!") }
Lassen Sie uns dies visualisieren und die Funktionsweise von sync.WaitGroup verstehen:
Gegenmechanismus:
- WaitGroup unterh?lt einen internen Z?hler
- wg.Add(n) erh?ht den Z?hler um n
- wg.Done() dekrementiert den Z?hler um 1
- wg.Wait() blockiert, bis der Z?hler 0 erreicht
Synchronisierungsablauf:
- Haupt-Goroutine ruft Add(3) auf, bevor Goroutinen gestartet werden
- Jede Goroutine ruft Done() auf, wenn sie abgeschlossen ist
- Die Hauptgoroutine wird bei Wait() blockiert, bis der Z?hler 0 erreicht
- Wenn der Z?hler 0 erreicht, wird das Programm fortgesetzt und sauber beendet
H?ufige Fallstricke, die es zu vermeiden gilt
package main
import (
"fmt"
"time"
)
func downloadFile(filename string) {
fmt.Printf("Starting download: %s\n", filename)
// Simulate file download with sleep
time.Sleep(2 * time.Second)
fmt.Printf("Finished download: %s\n", filename)
}
func main() {
fmt.Println("Starting downloads...")
startTime := time.Now() // Record start time
go downloadFile("file1.txt")
go downloadFile("file2.txt")
go downloadFile("file3.txt")
// Wait for goroutines to finish
time.Sleep(3 * time.Second)
elapsedTime := time.Since(startTime)
fmt.Printf("All downloads completed! Time elapsed: %s\n", elapsedTime)
}
Kan?le
So haben wir ein gutes Verst?ndnis dafür bekommen, wie die Goroutinen funktionieren. Nein, wie kommunizieren zwei Go-Routinen? Hier kommt der Kanal ins Spiel.
Kan?le in Go sind ein leistungsstarkes Nebenl?ufigkeitsprimitiv, das für die Kommunikation zwischen Goroutinen verwendet wird. Sie bieten Goroutinen die M?glichkeit, Daten sicher auszutauschen.
Stellen Sie sich Kan?le als Pipes vor: Eine Goroutine kann Daten an einen Kanal senden und eine andere kann sie empfangen.
hier sind einige Eigenschaften:
- Kan?le blockieren von Natur aus.
- Eine An Kanal senden Operation ch <- value blockiert, bis eine andere Goroutine vom Kanal empf?ngt.
- Eine Vom Kanal empfangen-Operation <-ch blockiert, bis eine andere Goroutine an den Kanal sendet.
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") startTime := time.Now() downloadFile("file1.txt") downloadFile("file2.txt") downloadFile("file3.txt") elapsedTime := time.Since(startTime) fmt.Printf("All downloads completed! Time elapsed: %s\n", elapsedTime) }
Warum führt ch <- ?hello“ zu einem Deadlock? Da Kan?le von Natur aus blockieren und wir hier ?Hallo“ weitergeben, wird die Haupt-Goroutine blockiert, bis es einen Empf?nger gibt, und da es keinen Empf?nger gibt, bleibt sie h?ngen.
Beheben wir dieses Problem, indem wir eine Goroutine hinzufügen
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") // Launch downloads concurrently go downloadFile("file1.txt") go downloadFile("file2.txt") go downloadFile("file3.txt") fmt.Println("All downloads completed!") }
Lass uns das visualisieren:
Diesmal wird die Nachricht von einer anderen Goroutine gesendet, damit die Haupt-Goroutine nicht blockiert wird, w?hrend sie an den Kanal gesendet wird, sodass sie zu msg := <-ch verschoben wird, wo sie die Haupt-Goroutine blockiert, bis sie die empf?ngt Nachricht.
Behebung des Hauptproblems, bei der Verwendung des Kanals nicht auf andere zu warten
Jetzt verwenden wir den Kanal, um das Problem mit dem Datei-Downloader zu beheben (main wartet nicht, bis andere fertig sind).
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") startTime := time.Now() // Record start time go downloadFile("file1.txt") go downloadFile("file2.txt") go downloadFile("file3.txt") // Wait for goroutines to finish time.Sleep(3 * time.Second) elapsedTime := time.Since(startTime) fmt.Printf("All downloads completed! Time elapsed: %s\n", elapsedTime) }
Visualisierung:
Machen wir einen Probelauf, um es besser zu verstehen:
Programmstart:
Hauptgoroutine erstellt Fertigkanal
Startet drei Download-Goroutinen
Jede Goroutine erh?lt einen Verweis auf denselben Kanal
Ausführung herunterladen:
- Alle drei Downloads laufen gleichzeitig
- Jeder dauert 2 Sekunden
- Sie k?nnen in beliebiger Reihenfolge enden
Kanalschleife:
- Hauptgoroutine tritt in die Schleife ein: for i := 0; ich < 3; ich
- Jedes <-done blockiert, bis ein Wert empfangen wird
- Die Schleife stellt sicher, dass wir auf alle drei Abschlusssignale warten
Schleifenverhalten:
- Iteration 1: Blockiert, bis der erste Download abgeschlossen ist
- Iteration 2: Blockiert, bis der zweite Download abgeschlossen ist
- Iteration 3: Blockiert, bis der endgültige Download abgeschlossen ist
Die Reihenfolge der Fertigstellung spielt keine Rolle!
Beobachtungen:
? Jeder Versand (erledigt <- true) hat genau einen Empfang (<-erledigt)
? Die Hauptgoroutine koordiniert alles durch die Schleife
Wie k?nnen zwei Goroutinen kommunizieren?
Wir haben bereits gesehen, wie zwei Goroutinen kommunizieren k?nnen. Wann? Die ganze Zeit. Vergessen wir nicht, dass die Hauptfunktion auch eine Goroutine ist.
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") startTime := time.Now() downloadFile("file1.txt") downloadFile("file2.txt") downloadFile("file3.txt") elapsedTime := time.Since(startTime) fmt.Printf("All downloads completed! Time elapsed: %s\n", elapsedTime) }
Lassen Sie uns dies visualisieren und einen Probelauf durchführen:
Probelauf:
Programmstart (t=0ms)
Erste Nachricht (t=1ms)
Zweite Nachricht (t=101ms)
Dritte Nachricht (t=201ms)
Kanal schlie?en (t=301 ms)
Abschluss (t=302–303 ms)
Gepufferte Kan?le
Warum brauchen wir gepufferte Kan?le?
Ungepufferte Kan?le blockieren sowohl den Sender als auch den Empf?nger, bis die andere Seite bereit ist. Wenn Hochfrequenzkommunikation erforderlich ist, k?nnen ungepufferte Kan?le zu einem Engpass werden, da beide Goroutinen pausieren müssen, um Daten auszutauschen.
Eigenschaften gepufferter Kan?le:
- FIFO (First In, First Out, ?hnlich der Warteschlange)
- Feste Gr??e, bei der Erstellung festgelegt
- Blockiert den Absender, wenn der Puffer voll ist
- Blockiert den Empf?nger, wenn der Puffer leer ist
Wir sehen es in Aktion:
package main import ( "fmt" "time" ) func downloadFile(filename string) { fmt.Printf("Starting download: %s\n", filename) // Simulate file download with sleep time.Sleep(2 * time.Second) fmt.Printf("Finished download: %s\n", filename) } func main() { fmt.Println("Starting downloads...") startTime := time.Now() downloadFile("file1.txt") downloadFile("file2.txt") downloadFile("file3.txt") elapsedTime := time.Since(startTime) fmt.Printf("All downloads completed! Time elapsed: %s\n", elapsedTime) }
Ausgabe (vor dem Auskommentieren des ch<-"dritten")
Warum hat es die Haupt-Goroutine nicht blockiert?
Ein gepufferter Kanal erm?glicht das Senden bis zu seiner Kapazit?t, ohneden Absender zu blockieren.
Der Kanal hat eine Kapazit?t von 2, was bedeutet, dass er zwei Werte in seinem Puffer speichern kann, bevor er blockiert wird.
Der Puffer ist bereits mit ?erster“ und ?zweiter“ voll. Da es keinen gleichzeitigen Empf?nger gibt, der diese Werte konsumiert, wird der Sendevorgang auf unbestimmte Zeit blockiert.
Da die Haupt-Goroutine auch für das Senden verantwortlich ist und es keine anderen aktiven Goroutinen gibt, die Werte vom Kanal empfangen, ger?t das Programm beim Versuch, die dritte Nachricht zu senden, in einen Deadlock.
Das Auskommentieren der dritten Nachricht führt zu einem Deadlock, da die Kapazit?t jetzt voll ist und die dritte Nachricht blockiert wird, bis der Puffer frei wird.
Wann sollten gepufferte Kan?le im Vergleich zu ungepufferten Kan?len verwendet werden?
Aspect | Buffered Channels | Unbuffered Channels |
---|---|---|
Purpose | For decoupling sender and receiver timing. | For immediate synchronization between sender and receiver. |
When to Use | - When the sender can proceed without waiting for receiver. | - When sender and receiver must synchronize directly. |
- When buffering improves performance or throughput. | - When you want to enforce message-handling immediately. | |
Blocking Behavior | Blocks only when buffer is full. | Sender blocks until receiver is ready, and vice versa. |
Performance | Can improve performance by reducing synchronization. | May introduce latency due to synchronization. |
Example Use Cases | - Logging with rate-limited processing. | - Simple signaling between goroutines. |
- Batch processing where messages are queued temporarily. | - Hand-off of data without delay or buffering. | |
Complexity | Requires careful buffer size tuning to avoid overflows. | Simpler to use; no tuning needed. |
Overhead | Higher memory usage due to the buffer. | Lower memory usage; no buffer involved. |
Concurrency Pattern | Asynchronous communication between sender and receiver. | Synchronous communication; tight coupling. |
Error-Prone Scenarios | Deadlocks if buffer size is mismanaged. | Deadlocks if no goroutine is ready to receive or send. |
Wichtige Erkenntnisse
Verwenden Sie gepufferte Kan?le, wenn:
- Sie müssen das Timing von Sender und Empf?nger entkoppeln.
- Die Leistung kann durch das Stapeln oder Einreihen von Nachrichten in die Warteschlange verbessert werden.
- Die Anwendung kann Verz?gerungen bei der Verarbeitung von Nachrichten tolerieren, wenn der Puffer voll ist.
Verwenden Sie ungepufferte Kan?le, wenn:
- Die Synchronisierung zwischen Goroutinen ist von entscheidender Bedeutung.
- Sie m?chten Einfachheit und eine sofortige übergabe von Daten.
- Die Interaktion zwischen Sender und Empf?nger muss sofort erfolgen.
Diese Grundlagen schaffen die Grundlage für fortgeschrittenere Konzepte. In unseren kommenden Beitr?gen werden wir Folgendes untersuchen:
N?chster Beitrag:
- Parallelit?tsmuster
- Mutex und Speichersynchronisation
Bleiben Sie dran, w?hrend wir unser Verst?ndnis der leistungsstarken Parallelit?tsfunktionen von Go weiter ausbauen!
Das obige ist der detaillierte Inhalt vonGoroutinen und Kan?le in Golang mit intuitiven Bildern verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

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

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

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

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

GO kompiliert das Programm standardm??ig in eine eigenst?ndige Bin?rdatei. Der Hauptgrund ist die statische Verknüpfung. 1. Einfacher Bereitstellung: Keine zus?tzliche Installation von Abh?ngigkeitsbibliotheken kann direkt über Linux -Verteilungen ausgeführt werden. 2. Gr??ere bin?re Gr??e: einschlie?lich aller Abh?ngigkeiten führt zu einer Erh?hung der Dateigr??e, kann jedoch durch Erstellen von Flags oder Komprimierungswerkzeugen optimiert werden. 3.. H?here Vorhersagbarkeit und Sicherheit: Vermeiden Sie Risiken, die durch ?nderungen der externen Bibliotheksversionen verursacht werden und die Stabilit?t verbessern; 4. Flexibilit?t begrenzter Betrieb: Kann nicht hei?es Update der gemeinsam genutzten Bibliotheken sowie eine Neukompilien und Bereitstellung erforderlich sind, um Abh?ngigkeitsf?lligkeiten zu beheben. Diese Funktionen sind für CLI-Tools, Microservices und andere Szenarien geeignet. In Umgebungen, in denen die Speicherung eingeschr?nkt ist oder auf zentrales Management beruht, sind Kompromisse erforderlich.

GOENSURSMEMORYSFETTYWITHOUTMANUALMANUMAGETROUGHAUTOMATICGARBAGECOLLECTION, Nopointerarithmetic, SafeConcurrency, Andruntimechecks.First, Go’sgarbageboceColectorAutomaticReclaimsUnusedMemory, Verhinderung von Verhinderung der Verhinderung von Verhinderung der

Um einen Pufferkanal in GO zu erstellen, geben Sie einfach die Kapazit?tsparameter in der Funktion machen. Mit dem Pufferkanal kann der Sendungsvorgang Daten vorübergehend speichern, wenn kein Empf?nger vorliegt, solange die angegebene Kapazit?t nicht überschritten wird. Zum Beispiel erstellt CH: = make (Chanint, 10) einen Pufferkanal, der bis zu 10 Ganzzahlwerte speichern kann. Im Gegensatz zu ungelandten Kan?len werden die Daten beim Senden nicht sofort blockiert, aber die Daten werden vorübergehend im Puffer gespeichert, bis sie vom Empf?nger weggenommen werden. Beachten Sie bitte: 1. Die Kapazit?tseinstellung sollte angemessen sein, um Speicherabf?lle oder h?ufiges Blockieren zu vermeiden. 2. Der Puffer muss verhindern, dass Speicherprobleme im Puffer auf unbestimmte Zeit angesammelt werden. 3. Das Signal kann vom Chanstruct {} -Typ übergeben werden, um Ressourcen zu sparen; Zu den h?ufigen Szenarien geh?rt die Kontrolle der Anzahl der Parallelit?t, Herstellerverbrauchermodelle und Differenzierung

GO ist ideal für die Systemprogrammierung, da es die Leistung von kompilierten Sprachen wie C mit der Benutzerfreundlichkeit und Sicherheit moderner Sprachen kombiniert. 1. In Bezug auf Datei- und Verzeichnisoperationen unterstützt das Betriebssystempaket von Go unterstützt die Erstellung, L?schung, Umbenennung und überprüfung, ob Dateien und Verzeichnisse vorhanden sind. Verwenden Sie OS.ReadFile, um die gesamte Datei in einer Codezeile zu lesen, die zum Schreiben von Sicherungsskripten oder Protokollierungstools geeignet ist. 2. In Bezug auf die Prozessverwaltung kann die Funktion von Exec.Command des OS/EXEC -Pakets externe Befehle ausführen, die Ausgabe erfassen, Umgebungsvariablen festlegen, Eingangs- und Ausgangsflüsse umleiten und die Lebensdauer von Prozesslebenszyklen für Automatisierungstools und Bereitstellungsskripte geeignet sind. 3. In Bezug auf Netzwerk und Parallelit?t unterstützt das NET -Paket TCP/UDP -Programmierung, DNS -Abfrage und Originals?tze.

In der GO -Sprache muss eine Strukturmethode aufgerufen werden, muss zun?chst die Struktur und die Methode definieren, die den Empf?nger bindet, und auf sie zugreift mit einer Punktzahl. Nach der Definition des Strukturrechtecks ??kann die Methode über den Wertempf?nger oder den Zeigerempf?nger deklariert werden. 1. Verwenden Sie den Wertempf?nger wie Func (rrectangle) aa () int und rufen Sie ihn direkt über rect.Area () an; 2. Wenn Sie die Struktur ?ndern müssen, verwenden Sie den Zeigerempf?nger wie Func (R*Rechteck) Setwidth (...) und behandelt automatisch die Umwandlung von Zeigern und Werten. 3. Bei der Einbettung der Struktur wird die Methode der eingebetteten Struktur verbessert und kann direkt durch die ?u?ere Struktur aufgerufen werden. 4..

In Go ist eine Schnittstelle ein Typ, der Verhalten ohne Angabe der Implementierung definiert. Eine Schnittstelle besteht aus Methodensignaturen und jedem Typ, der diese Methoden implementiert, die die Schnittstelle automatisch erfüllt. Wenn Sie beispielsweise eine Lautsprecherschnittstelle definieren, die die Speak () -Methode enth?lt, k?nnen alle Typen, die die Methode implementieren, als Sprecher betrachtet werden. Schnittstellen eignen sich zum Schreiben gemeinsamer Funktionen, Abstrakt -Implementierungsdetails und Verwendung von Scheinobjekten im Testen. Das Definieren einer Schnittstelle verwendet das Schlüsselwort der Schnittstelle und listet Methodensignaturen auf, ohne den Typ ausdrücklich zu deklarieren, um die Schnittstelle zu implementieren. Gemeinsame Anwendungsf?lle umfassen Protokolle, Formatierung, Abstraktionen verschiedener Datenbanken oder Dienste sowie Benachrichtigungssysteme. Zum Beispiel k?nnen sowohl Hund- als auch Robotertypen Sprechmethoden implementieren und an dieselbe Anno weitergeben

In der GO-Sprache werden String-Operationen haupts?chlich über Strings-Pakete und integrierte Funktionen implementiert. 1.Strings.Contains () wird verwendet, um festzustellen, ob eine Zeichenfolge einen Substring enth?lt, und gibt einen booleschen Wert zurück. 2.Strings.index () kann den Ort finden, an dem das Substring zum ersten Mal erscheint und wenn es nicht existiert, gibt es -1 zurück. 3.Strings.ReplaceAll () kann alle übereinstimmenden Substrings ersetzen und auch die Anzahl der Ersetzungen durch Zeichenfolgen steuern. Replace (); 4.Len () Funktion wird verwendet, um die L?nge der Bytes der Zeichenfolge zu erhalten. Bei der Verarbeitung von Unicode müssen Sie jedoch auf den Unterschied zwischen Zeichen und Bytes achten. Diese Funktionen werden h?ufig in Szenarien wie Datenfilterung, Textanalyse und String -Verarbeitung verwendet.

TheGoiopackageProviDEnterFaCesLikeraderAndWritertOhandlei/ooperationsgerafigAcrossSources.1.io.
