《Go语言编程》中 第一个项目是calc,按照作者在书中的描述,在linux下运行没有问题。但经过实践,程序运行后不能打印出书中所描述的效果。
经过测试,发现windows命令行在执行calc add 2 3时,把calc也作为一个参数,这样使得真个程序中的参数数组下标与书中描述的有所不同。
现上传修改后的程序,供大家参考。
calc.go
package main
import "os"
import "fmt"
import "simplemath"
import "strconv"
var Usage = func() {
fmt.Println("USAGE: calc command [arguments] ...")
fmt.Println("\nThe commands are:\n\tadd\tAddition of two values.\n\tsqrt\tSquare root of a non-negative value.")
}
func main() {
args := os.Args
fmt.Println("args: ", args) // print arguments, find some difference with it in the book
if args == nil || len(args) < 2 {
Usage()
return
}
// arguments number is not same
switch args[1] {
case "add":
if len(args) != 4 { // arguments number is not same
fmt.Println("USAGE:calc add <integer1><integer2>")
return
}
v1, err1 := strconv.Atoi(args[2])// arguments number is not same
v2, err2 := strconv.Atoi(args[3])// arguments number is not same
if err1 != nil || err2 != nil {
fmt.Println("USAGE:calc add <integer1><integer2>")
return
}
ret := simplemath.Add(v1, v2)
fmt.Println("Result: ", ret)
case "sqrt" :
if len(args) != 3 { // arguments number is not same
fmt.Println("USAGE:calc sqrt <integer>")
return
}
v, err := strconv.Atoi(args[2])
if err != nil {
fmt.Println("USAGE: calc sqrt <integer>")
return
}
ret := simplemath.Sqrt(v)
fmt.Println("Result: ", ret)
default:
Usage()
}
}