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

我刚开始学习 Go,并使用该ProbablyPrime库编写了一个主要的测试程序。


package main


import (

    "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。


我猜命令行参数解析有问题。如何解决?


墨色风雨
浏览 198回答 1
1回答

眼眸繁星

问题出在这一行: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 errorn, err = strconv.ParseInt(os.Args[1], 10, 64)if err != nil {&nbsp; &nbsp; log.Fatal(err)}笔记:另请注意,第一个参数(os.Args[0]是可执行文件的名称),并且由于您期望并使用 2 个额外参数,因此您应该检查的长度os.Args是否大于 2 而不是 1:if len(os.Args) > 2 {&nbsp; &nbsp; // os.Args[1] and os.Args[2] is valid}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go