登录
首页 >  Golang >  Go问答

如何在bufio.NewScanner中执行重置操作?

来源:stackoverflow

时间:2024-03-05 11:57:24 360浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何在bufio.NewScanner中执行重置操作?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

有没有办法重置 *scanner(来自 bufio.newscanner)或清除旧令牌? 不幸的是,“func (b *reader) reset(r io.reader)”不适用于 *scanner。

更新/说明: 我想在“time.sleep(30 * time.second)”结束时继续使用 os.stdout 的最新数据,并跳过这 30 秒内可以读取的所有数据。

我目前正在使用 for 循环作为肮脏的解决方法:

scanner := bufio.NewScanner(os.Stdout)
for scanner.Scan() {
    fmt.Println(scanner.Text())

    if scanner.Text() == "abc" {
        //do something that takes a little time
        time.Sleep(30 * time.Second)

        // my dirty workaround:
        // skips all old tokens/inputs
        for skip := time.Now(); time.Since(skip).Seconds() < 10; {
            scanner.Scan()
        }
    }
}

正确答案


在 goroutine 中运行长操作。 goroutine 运行时丢弃输入。

scanner := bufio.NewScanner(os.Stdout)
var discard int32
var wg sync.WaitGroup
for scanner.Scan() {
    if atomic.LoadInt32(&discard) != 0 {
        continue
    }

    fmt.Println(scanner.Text())

    if scanner.Text() == "abc" {
        atomic.StoreInt32(&discard, 1)
        wg.Add(1)
        go func() {
            defer wg.Done()
            defer atomic.StoreInt32(&discard, 0)
            //do something that takes a little time
            time.Sleep(30 * time.Second)
        }()
    }
}

wg.Wait() // wait for long process after EOF or error.

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>