为了账号安全,请及时绑定邮箱和手机立即绑定

如何有效地从 Go 中的 stdin 读取数字(或者为什么 fmt.Scanf 效率如此低下)

如何有效地从 Go 中的 stdin 读取数字(或者为什么 fmt.Scanf 效率如此低下)

Go
当年话下 2021-10-04 15:39:14
我开始参加 Go 编程比赛(只是为了学习语言),令我惊讶的是发现var T intfmt.Scanf("%d", &T)慢得难以想象。有多慢?到读10 ^ 5的整数它带我2.5秒(与Python做它在0.8秒)。那么为什么它这么慢,我应该如何正确阅读int,uint64以及float64?
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

如果你只有整数作为输入,这应该更快(虽然没有测试)


package main


import (

    "io/ioutil"

    "log"

    "os"

    "strconv"

)


func read() (int64, error) {

    b, err := ioutil.ReadAll(os.Stdin)

    if err != nil {

        return 0, err

    }


    // use strconv.ParseUint and strconv.ParseFloat in a similar way

    return strconv.ParseInt(string(b[:len(b)-1]), 10, 0)

}


func main() {

    i, err := read()

    if err != nil {

        log.Fatal(err)

    }


    println(i)

}

像这样运行


echo 123 | go run main.go

对于交互式输入,您可能想要使用 bufio.NewReader


查看完整回答
反对 回复 2021-10-04
  • 1 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信