天天看點

用Go語言從零寫一個Java虛拟機-02從模仿Java指令行工具開始第二節 從模仿Java指令行工具開始

第二節 從模仿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 的問題

用Go語言從零寫一個Java虛拟機-02從模仿Java指令行工具開始第二節 從模仿Java指令行工具開始

修改 launch.json 增加了一個環境變量選項

"GO111MODULE": "off"

就搞定了。

用Go語言從零寫一個Java虛拟機-02從模仿Java指令行工具開始第二節 從模仿Java指令行工具開始