学习Java虚拟机以及go语法,记录下自己的学习过程
第1章 命令行工具
1.1 准备工作 1.1.1 安装JDK1.1.2 安装Go1.1.3 创建目录结构 1.2 java命令1.3 编写命令行工具1.4 测试本章代码1.5 本章小结这里就不作说明了,看书就可以轻松完成。
问题:如何启动Java应用程序? 首先启动Java虚拟机,然后加载主类,最后调用主类的main()方法。
问题:Java虚拟机从哪个类启动应用程序? Java虚拟机规范没有明确规定。也就是说,是由虚拟机实现自行决定的。比如Oracle的Java虚拟机实现是通过java命令来启动的,主类名由命令行参数指定。Java命令有如下4种形式:
java [-options] class [args] java [-options] -jar jarfile [args] javaw [-options] class [args] javaw [-options] -jar jarfile [args]
注:java是标准选项,javaw是非标准选项。
先上代码,新建了一个cmd.go文件,如下:
package main import "flag" import "fmt" import "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.Parse() args := flag.Args() if len(args) > 0 { cmd.class = args[0] cmd.args = args[1:] } return cmd } func printUsage() { fmt.Printf("Usage: %s [-option] class [args...]\n", os.Args[0]) }初看go语言代码有点懵逼,查了一下go语言api才慢慢看懂,来一行一行理解:
package就是包,不多说了,有java基础就看懂了import导入包struct表示定义结构体,类似java的成员变量,本人是这么理解的func parseCmd() *Cmd新建方法名为parseCmd,指针指向Cmd结构体cmd := &Cmd{}类似java的newflag.Usage = printUsage给Usage赋值,flag是内部包,自带Usageflag.BoolVar(&cmd.helpFlag, “help”, false, “print help message”)这行有点内容了 flag 是Go 标准库提供的解析命令行参数的包。 使用方式: flag.Type(name, defValue, usage) 其中Type为String, Int, Bool等;并返回一个相应类型的指针。 flag.TypeVar(&flagvar, name, defValue, usage) 将flag绑定到一个变量上flag.Parse()表示调用Parse()函数解析选项args := flag.Args()表示调用flag.Args函数可以捕获其他没有被解析的参数,后续看main方法例子return cmd表示返回值Println :可以打印出字符串,和变量 Printf : 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整型变量和整型
a := 10 fmt.Println(a) //right fmt.Println("abc") //right fmt.Printf("%d",a) //right fmt.Printf(a) //error在ch01目录下创建main.go文件,然后输入代码:
package main import "fmt" func main() { cmd := parseCmd() if (cmd.helpFlag || cmd.class == "") { printUsage() } else { println("helpFlag==",cmd.helpFlag) } }注:只为了测试一个-help功能
说明:go语言没使用的import包的内容会编辑报错
编译通过
C:\Go\bin>go install jvmgo\ch01 C:\Go\bin>输入help选项,返回了false,未执行printUsage()方法
C:\Go\bin>ch01.exe help helpFlag== false C:\Go\bin>输入-help选项,返回正确的信息
C:\Go\bin>ch01.exe -help Usage: ch01.exe [-option] class [args...]注:测试二和测试三区别在于一个“-”符号,go语言flag包意义就是命令行参数解析
flag – 命令行参数解析 没有输入“-”符号的参数,flag.Args()函数捕获没有被解析的参数。
搭建好开发环境,学习java命令用法,使用go语言编写一个简化版的命令行工具。