2016-04-22 6 views
3

In Go kann man Einweg-Kanäle erstellen. Es ist eine sehr praktische Funktion, wenn man einen Satz von Operationen auf dem gegebenen Kanal einschränken möchte. Soweit ich sehen kann, ist diese Funktion nur für die Argumente der Funktion und die Typspezifikation der Variablen nützlich, während das Erstellen von Einweg-Kanälen über make für mich seltsam aussieht. Ich habe diese question gelesen, aber es geht nicht darum, in Go nur Kanäle zu lesen (oder zu schreiben), es geht um die Verwendung im Allgemeinen. Also, meine Frage bezieht sich auf Anwendungsfälle des nächsten Codes:Was ist der Punkt der Erstellung von Einweg-Kanälen in Go

writeOnly := make(chan<- string) 
readOnly := make(<-chan string) 
+0

Es gibt keinen Sinn wirklich; mache keine direktionalen Kanäle. – JimB

+0

@ JimB, könnten Sie bitte erklären warum? –

+0

Sie können einen Nur-Richtungs-Kanal für nichts Nützliches verwenden, außer für die Blockierung für immer. Es ist also nicht nötig, jemals einen zu erstellen. – JimB

Antwort

3

Theoretisch können Sie schreibgeschützte Kanäle für Komponententests verwenden, um beispielsweise sicherzustellen, dass Ihr Code nicht mehr als eine bestimmte Anzahl von Malen in einen Kanal schreibt.

Etwas wie folgt aus: http://play.golang.org/p/_TPtvBa1OQ

package main 

import (
    "fmt" 
) 

func MyCode(someChannel chan<- string) { 
    someChannel <- "test1" 
    fmt.Println("1") 
    someChannel <- "test2" 
    fmt.Println("2") 
    someChannel <- "test3" 
    fmt.Println("3") 
} 

func main() { 
    writeOnly := make(chan<- string, 2) // Make sure the code is writing to channel jsut 2 times 
    MyCode(writeOnly) 
} 

Aber das wäre ziemlich dumm Technik für Unit-Tests sein. Es empfiehlt sich, einen gepufferten Kanal zu erstellen und dessen Inhalt zu überprüfen.

+0

Hm erwähnt, ich kann einen regulären Kanal erstellen und es an die Funktion übergeben, die schreibgeschützten Kanal erwartet. –

+1

Richtig, wie wäre es mit 3-D-Party-Bibliotheken, die nicht-direktionalen Kanal nehmen, aber wir wollen es nicht lesen/schreiben testen? –

1

Einer der Hauptgrund, dass die Menschen-Typen verwenden (vor allem in Go) als eine Form der Dokumentation ist. In der Lage zu zeigen, dass ein Kanal schreibgeschützt oder schreibgeschützt ist, kann der Verbraucher der API eine bessere Vorstellung davon haben, was vor sich geht.

+2

Sie haben natürlich Recht. Aber meine Frage betrifft nicht die Verwendung von Typen. Es geht speziell darum, unidirektionale Kanäle über 'make' zu ​​erzeugen. –

+1

Die Direktionalität der Kanäle ist Teil des Typs - genau wie der Elementtyp. Es ist explizit in der [spec] (https://golang.org/ref/spec#Channel_types) –