2016-05-25 7 views
1

Angenommen, wir haben mehrere Benachrichtigungsquellen (Kanäle) und möchten einige ähnliche Aufgaben bei einigen dieser Benachrichtigungsereignisse ausführen. Betrachten wir zum Beispiel den Fall, in dem wir alle 10 Minuten doSomething() anrufen und auch auf Anfrage des Benutzers. Eine mögliche Implementierung in Go könnte etwa so aussehen:Go-Sprache - Ausführen desselben Codes für mehrere ausgewählte Fälle

var ticker = time.NewTicker(10*time.Minute) 
nowDoSomething := make(chan time.Time, 1) 
for { 
    select { 
    case <-ticker.C: 
     nowDoSomething<-time.Now() 

    case <-userReq: // some channel activated occasionally 
     nowDoSomething<-time.Now() 

    case <-nowDoSomething: 
     doSomething() 
    } 
} 

Was wären andere, vielleicht bessere Möglichkeiten, um eine ähnliche Funktionalität zu erreichen?

+0

'gehen fmt 'ist dein bester Freund, bitte benutze es. – OneOfOne

Antwort

-2

Warum eine Signalisierung an sich selbst über einen Kanal, wenn Sie doSomething() aufrufen können? Ich verstehe, dass etwas nicht genau eine Funktion ist, aber Sie können immer eine lokale Schließung verwenden.

ein funktionsfähiges Beispiel Siehe:

package main 

import (
    "fmt" 
    "time" 
) 



func someRoutine (userReq chan int) { 
    doSomething := func() { 
     fmt.Printf ("OK %v\n", time.Now()) 
    } 

    var ticker = time.NewTicker(10*time.Second) 
    for { 
    select { 
    case <-ticker.C: 
     doSomething() 
    case <-userReq: // some channel activated occasionally 
     doSomething() 
    } 
    } 
} 

func main() { 
    userReq := make(chan int, 1) 
    go someRoutine(userReq); 

    userReq <- 1 // user requested some action here (just to mark the start) 
    time.Sleep(15*time.Second) 
    userReq <- 1 // user requested some action here 

    time.Sleep(30*time.Second)// Put your own waiting and exiting logic here 
} 

Wenn Sie es immer noch über diese einfache Korrektur optimieren wollen, gibt es immer einige Alternativen zur Verfügung. Aber mit nur zwei Kanälen, von denen Sie lesen können, stellen Sie sicher, dass Sie keine vorzeitige Optimierung vornehmen.

+0

Go Syntax mag das nicht. Sie erhalten diesen Fehler "Ausgewählte Fälle können keine Listen sein". – hagh

+0

Bearbeitet für leichteres Lesen. Originalfehler wurde entfernt. – Seva

0

Vielleicht könnten Sie dies tun, um die Select-Funktion aus dem reflektieren Paket mit:

func auswählen (Fälle [] SELECT) (gewählt int, recv Wert, recvOK bool)