Masalah semasa menguji gesaan cli secara interaktif, pengimbas tidak menunggu input pengguna

WBOY
Lepaskan: 2024-02-13 21:18:18
ke hadapan
1173 orang telah melayarinya

交互测试 cli 提示时出现问题,扫描仪不等待用户输入

editor php Yuzai mendapati semasa menjalankan ujian interaktif, kadangkala masalah akan dihadapi. Salah satu masalah biasa ialah apabila berinteraksi menggunakan antara muka baris arahan (CLI), pengimbas mungkin tidak menunggu input pengguna. Ini bermakna apabila pengguna digesa untuk input, program meneruskan pelaksanaan serta-merta tanpa menunggu respons pengguna. Ini boleh menyebabkan program ralat atau tidak dilaksanakan dengan betul. Penyelesaian kepada masalah ini adalah dengan menggunakan teknik atau kaedah yang sesuai untuk memastikan pengimbas menunggu input pengguna untuk memastikan ujian interaksi lancar.

Kandungan soalan

Saya cuba menulis ujian untuk mengesahkan gesaan cli, mensimulasikan input pengguna sebagai tindak balas kepada beberapa output program.

Bagaimana untuk membuat scanner.scan menunggu penulisan yang lain?

Apa yang saya ada setakat ini:

    b := &bytes.buffer{}
    fmt.fprint(b, "0")
    go func() {
        time.sleep(1 * time.second)
        for i := 1; i < 4; i++ {
            fmt.fprint(b, i)
            time.sleep(1 * time.second)
        }
    }()

    scanner := bufio.newscanner(b)
    for scanner.scan() {
        log.print(scanner.text())
    }
    if err := scanner.err(); err != nil {
        log.println("problem while scanning:", err)
    }
Salin selepas log masuk

Hasil yang diharapkan ialah: 0123

Hasil sebenar ialah: 0

Saya mencuba versi io.pipe

r, w := io.Pipe()
    fmt.Fprint(w, "0")
    go func() {
        time.Sleep(1 * time.Second)
        for i := 1; i < 4; i++ {
            fmt.Fprint(w, i)
            time.Sleep(1 * time.Second)
        }
    }()

    scanner := bufio.NewScanner(r)
    for scanner.Scan() {
        log.Print(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        log.Println("problem while scanning:", err)
    }
Salin selepas log masuk

Keputusan: Ralat maut: semua goroutine sedang tidur - kebuntuan!

Penyelesaian

Apabila menggunakan paip, menulis dan membaca adalah serentak. Tanpa bacaan yang sepadan, penulisan tidak dapat diselesaikan. Alihkan tulisan pertama ke goroutine. Dan tutup hujung tulis paip supaya pengimbas berhenti mengimbas.

    r, w := io.Pipe()
    go func() {
        defer w.Close()

        fmt.Fprint(w, "0")

        time.Sleep(1 * time.Second)
        for i := 1; i < 4; i++ {
            fmt.Fprint(w, i)
            time.Sleep(1 * time.Second)
        }
    }()

    scanner := bufio.NewScanner(r)
    for scanner.Scan() {
        log.Print(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        log.Println("problem while scanning:", err)
    }
Salin selepas log masuk

Atas ialah kandungan terperinci Masalah semasa menguji gesaan cli secara interaktif, pengimbas tidak menunggu input pengguna. 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