2012-12-02 10 views
5

Da Go Kanäle hat, habe ich mich gefragt, warum die Standard-Bibliothek nicht entworfen worden ist, um sie auch für IO zu verwenden.IO-Kanäle vs Leser/Schreiber

Dafür gibt es Lese- und Schreibtypen, aber was wäre das Problem bei der Verwendung von Kanälen?

Eine Funktion könnte einen Kanal von Byte-Slices zurückgeben (unter der Annahme, dass Einzelbyte- oder sogar Einzelbit-Returns zu ineffizient sind) und einen Kanal für Löschungsanforderungen und einen Kanal für Fehlerberichte aufnehmen.

-Der neugierige Go Novize.

Antwort

9

Kanäle sind eine gute Lösung für die Kommunikation zwischen den Goroutines. Wenn ein Programm etwas Einfaches tut, wie zum Beispiel das Lesen von stdin, etwas mit dem Stream macht und das Ergebnis in stdout ausgibt - dann ist die Verwendung eines Kanals ein Overkill, was die Performance unnötig beeinträchtigt.

Solange die Standardbibliothek nicht spezifisch für goroutines in einem Ort etwas nicht bieten, miteinander zu kommunizieren, gibt es keinen guten Grund, einfache Vorgänge zu modellieren, wie die von io.Reader oder io.Writer unter Verwendung von Kanälen, jeweils ein Kanal auf Basis hat Methodensatz (API).

Zusätzlich, wo erforderlich, kann die einfache Implementierung in einen Kanal gehüllt werden, während das Gegenteil, um eine Kanalimplementierung zurück zu seinem Primitiv zu "entpacken", nicht möglich ist. Go-Autoren mögen Offenheit offensichtlich, was dazu führt, dass Leistungsengpässe nicht verborgen (und überraschend) sind.

+2

Also ich denke, Ihr Punkt ist zweifach: 1) Kanäle werden in diesem Fall ein Leistungsengpass sein, und 2) Kanäle würden die IO verstecken und die Designer mögen das nicht. Es wäre interessant, Leistungsmessungen von Leser/Schreiber und Kanälen durchzuführen, um zu verstehen, was die tatsächliche Leistungseinbuße sein wird - wobei natürlich realisiert wird, dass der/die Kompilierer für einfache Fälle optimieren können und Optimierungen mit der Zeit komplexer werden. Rob Pike hat über Leistungsoptimierungsmöglichkeiten für Kanäle gesprochen. –