如何在Go中获取命令参数?

时间:2015-01-07 07:35:50

标签: go command-line-arguments

我刚开始学习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

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

1 个答案:

答案 0 :(得分:5)

问题在于这一行:

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
}