如何在 Go 中获取命令参数?
How to take command argument in Go?
刚开始学围棋,用ProbablyPrime
库写了一个prime测试程序。
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)
}
}
代码可以成功编译。当我运行它时,它总是 return 0 is a composite because it can be divided by 2
.
我猜命令行参数解析有问题。如何解决?
这一行有问题:
n,_ = strconv.ParseInt(os.Args[1],64,64)
ParseInt(s string, base int, bitSize int) (i int64, err error)
的文档指出:
ParseInt interprets a string s in the given base (2 to 36) and returns the corresponding value i.
基数最多可以36
,你传64
。在这种情况下,将返回一个错误(您使用空白标识符 _
将其丢弃),并且 n
将具有零值,即 0
因此您会看到输出为
0 is a composite because it can be divided by 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
}
刚开始学围棋,用ProbablyPrime
库写了一个prime测试程序。
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)
}
}
代码可以成功编译。当我运行它时,它总是 return 0 is a composite because it can be divided by 2
.
我猜命令行参数解析有问题。如何解决?
这一行有问题:
n,_ = strconv.ParseInt(os.Args[1],64,64)
ParseInt(s string, base int, bitSize int) (i int64, err error)
的文档指出:
ParseInt interprets a string s in the given base (2 to 36) and returns the corresponding value i.
基数最多可以36
,你传64
。在这种情况下,将返回一个错误(您使用空白标识符 _
将其丢弃),并且 n
将具有零值,即 0
因此您会看到输出为
0 is a composite because it can be divided by 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
}