Heim  >  Artikel  >  Backend-Entwicklung  >  Akzeptieren Sie keine doppelten Eingaben von stdin

Akzeptieren Sie keine doppelten Eingaben von stdin

WBOY
WBOYnach vorne
2024-02-08 22:50:091038Durchsuche

不接受来自 stdin 的重复输入

PHP-Editor Apple stellt Ihnen in diesem Artikel einen wichtigen Hinweis vor: „Akzeptieren Sie keine wiederholten Eingaben von stdin“. Beim Programmieren verwenden wir oft stdin als Eingabequelle, aber wiederholte Eingaben können zu Fehlern oder unvorhersehbarem Verhalten im Programm führen. Daher müssen wir bei der Verwendung von stdin darauf achten, doppelte Eingaben zu vermeiden, um den normalen Betrieb des Programms sicherzustellen. Im folgenden Artikel werden wir dieses Problem im Detail untersuchen und einige Lösungen und praktische Vorschläge bereitstellen, um den Lesern zu helfen, besser mit doppelten Situationen bei der Standardeingabe umzugehen.

Frageninhalt

Ich habe ein erfundenes Programm, dessen Ziel darin besteht, Text auf der Standardeingabe (so oft wie nötig) wiederzugeben und nach 10 Sekunden zu beenden. Der Code lautet wie folgt:

package main

import (
    "bufio"
    "fmt"
    "os"
    "time"
)

func main() {
    input := make(chan string)
    abort := make(chan bool)

    // exit after 10 sec
    go func() {
        time.Sleep(10 * time.Second)
        abort <- true
    }()

    go func() {
        cmd := bufio.NewScanner(os.Stdin)
        for cmd.Scan() {
            input <- "<- " + cmd.Text()
        }
    }()

    select {
    case <-abort:
        fmt.Println("exiting")
        return
    case cmd := <-input:
        fmt.Println(cmd)
    }
}

Das Problem besteht darin, dass, wenn ich die erste Textzeile eingebe, ein Echo auf stdout erfolgt und das Programm beendet wird. Ich möchte in 10 Sekunden so viele Befehle wie möglich eingeben.

Was habe ich falsch gemacht?

Workaround

Der Abbruchkanal wird nach 10 Sekunden geschlossen, wodurch der erste Auswahlfall (<-abort) ausgelöst und das Programm beendet werden kann. Das habe ich bekommen

func main() {
input := make(chan string)
abort := make(chan bool)

// exit after 10 sec
go func() {
    time.Sleep(10 * time.Second)
    close(abort) // Close the channel after 10 seconds
}()

go func() {
    cmd := bufio.NewScanner(os.Stdin)
    for cmd.Scan() {
        input <- "<- " + cmd.Text()
    }
}()

for {
    select {
    case <-abort:
        fmt.Println("closing connection")
        return
    case cmd := <-input:
        fmt.Println(cmd)
    }
}
}'

Ich habe „for“ verwendet, um die äußere Select-Anweisung durch eine Endlosschleife zu ersetzen Nach dem 10-Sekunden-Timeout schließe ich den Abbruchkanal mit einer close(abort)-Anweisung. Dadurch wird der SELECT-Anweisung mitgeteilt, dass eine Zeitüberschreitung aufgetreten ist und die Ausführung des ersten Falls (<-abort) fortgesetzt werden soll, wenn der Kanal geschlossen wird. Ich muss gerade etwas schreiben, also hoffe ich, dass du es verstehst.

Das obige ist der detaillierte Inhalt vonAkzeptieren Sie keine doppelten Eingaben von stdin. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen