第二節 從模仿Java指令行工具開始
本節我将模仿在終端使用
java
指令時,終端的輸入輸出。
本節主要目的在于解析指令行輸入。
2.實操
建立檔案夾
gova
檔案位置:
gova/cmd.go
package main
import (
"flag"
"fmt"
"os"
)
type Cmd struct {
helpFlag bool
versionFlag bool
cpOption string
class string
args []string
}
func parseCmd() *Cmd {
cmd := &Cmd{}
flag.Usage = printUsage
flag.BoolVar(&cmd.helpFlag, "help", false, "print help message")
flag.BoolVar(&cmd.helpFlag, "?", false, "print help message")
flag.BoolVar(&cmd.versionFlag, "version", false, "print version and exit")
flag.StringVar(&cmd.cpOption, "classpath", "", "classpath")
flag.StringVar(&cmd.cpOption, "cp", "", "classpath")
flag.Parse()
args := flag.Args()
if len(args) > 0 {
cmd.class = args[0]
cmd.args = args[1:]
}
return cmd
}
func printUsage() {
fmt.Printf("Usage: %s [-options] class [args...]\n", os.Args[0])
}
檔案位置:
gova/main.go
package main
import (
"fmt"
)
func main() {
cmd := parseCmd()
if cmd.versionFlag {
fmt.Println(`
version 0.0.1
base go: go version go1.13.1
base java:java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
`)
}
if cmd.helpFlag || cmd.class == "" {
printUsage()
} else {
startJVM(cmd)
}
}
func startJVM(cmd *Cmd) {
fmt.Printf("Gova started! classpath: %s class: %s args: %v\n", cmd.cpOption, cmd.class, cmd.args)
}
2. 小結
我從
main
包開始,建構了兩個檔案, 做出了第一個結構體
Cmd
用以承載和解析指令行傳遞過來的參數。
下一節我嘗試從
classpath
裡面拿到 class 檔案後解析 class 檔案。
解決VScode-go語言debug時遇到 go:cannot find main module 的問題
修改 launch.json 增加了一個環境變量選項
"GO111MODULE": "off"
就搞定了。