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

如何在 Go 中使用命令参数?

如何在 Go 中使用命令参数?

Go
墨色风雨 2021-09-10 17:29:35
我刚开始学习 Go,并使用该ProbablyPrime库编写了一个主要的测试程序。package mainimport (    "fmt"    "math/big"    "math"    "os"    "strconv")func prime_test(n int64, certainty int)(bool,float64){    var probobility float64    i := big.NewInt(n)    isPrime := i.ProbablyPrime(certainty)    probobility = 1 - 1/math.Pow(4,10)    return isPrime, probobility}func why_not_prime(n int64)(int64){    var i int64     for  i=2 ; i<n/2; i++ {        if n%i == 0 {return i}    }    return i}func main() {    var n int64    var certainty int    var isPrime bool    var probobility float64     if len(os.Args) > 1 {    n,_ = strconv.ParseInt(os.Args[1],64,64)    certainty,_ = strconv.Atoi(os.Args[2])    }    isPrime, probobility = prime_test(n,certainty)    if isPrime {        fmt.Printf("%d is probably %0.8f%% a prime.", n, probobility*100)    } else {        var i int64        i = why_not_prime(n)        fmt.Printf("%d is a composite because it can be divided by %d", n, i)    }}代码可以成功编译。当我运行它时,它总是返回0 is a composite because it can be divided by 2。我猜命令行参数解析有问题。如何解决?
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

问题出在这一行:


n,_ = strconv.ParseInt(os.Args[1],64,64)

国家的文件ParseInt(s string, base int, bitSize int) (i int64, err error):


ParseInt 解释给定基数(2 到 36)中的字符串 s 并返回相应的值 i。


基地最多可以36和你通过64。在这种情况下,将返回一个错误(您可以使用空白标识符将其丢弃_),并且n将具有零值,0因此您将看到输出为


0是合数,因为它可以被 2 整除


解决方案:


将有问题的行更改为:


n, _ = strconv.ParseInt(os.Args[1], 10, 64)

它应该工作。此外,您不应该丢弃错误,因为您会遇到这样的情况。而是像这样正确处理它们:


var err error

n, err = strconv.ParseInt(os.Args[1], 10, 64)

if err != nil {

    log.Fatal(err)

}

笔记:


另请注意,第一个参数(os.Args[0]是可执行文件的名称),并且由于您期望并使用 2 个额外参数,因此您应该检查的长度os.Args是否大于 2 而不是 1:


if len(os.Args) > 2 {

    // os.Args[1] and os.Args[2] is valid

}


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

添加回答

举报

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