Jangan terima input pendua daripada stdin

WBOY
Lepaskan: 2024-02-08 22:50:09
ke hadapan
1036 orang telah melayarinya

不接受来自 stdin 的重复输入

Editor PHP Apple akan memperkenalkan anda kepada nota penting dalam artikel ini: "Jangan terima input berulang daripada stdin". Dalam pengaturcaraan, kami sering menggunakan stdin sebagai sumber input, tetapi input berulang mungkin menyebabkan ralat atau tingkah laku yang tidak dapat diramalkan dalam atur cara. Oleh itu, kita perlu memberi perhatian untuk mengelakkan pertindihan input apabila menggunakan stdin untuk memastikan operasi normal program. Dalam artikel berikut, kami akan meneroka masalah ini secara terperinci dan menyediakan beberapa penyelesaian serta cadangan praktikal untuk membantu pembaca mengendalikan situasi pendua input stdin dengan lebih baik.

Kandungan soalan

Saya mempunyai program rekaan yang matlamatnya adalah untuk menggemakan teks pada input standard (berapa kali yang diperlukan) dan keluar selepas 10 saat. Kodnya adalah seperti berikut:

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)
    }
}
Salin selepas log masuk

Masalahnya ialah apabila saya memasukkan baris pertama teks, ia bergema kepada stdout dan program keluar. Saya mahu memasukkan seberapa banyak arahan yang mungkin dalam 10 saat.

Apa salah saya?

Penyelesaian

Saluran abort ditutup selepas 10 saat, yang membolehkan kes pemilihan pertama (<-abort) dicetuskan dan keluar dari program. Ini yang saya dapat

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)
    }
}
}'
Salin selepas log masuk

Saya menggunakan "untuk" untuk menggantikan pernyataan pilihan luar dengan gelung tak terhingga Selepas tamat masa 10 saat, saya menutup saluran batal menggunakan pernyataan tutup(abort). Ini memberitahu pernyataan pilih bahawa tamat masa telah berlaku dan pelaksanaan kes pertama (<-abort) harus diteruskan apabila saluran ditutup. Saya mempunyai taip sezier jadi saya harap anda faham.

Atas ialah kandungan terperinci Jangan terima input pendua daripada stdin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!