学习Java虚拟机以及go语法,记录下自己的学习过程
第1章 命令行工具
- 1.1 准备工作
- 1.1.1 安装JDK
- 1.1.2 安装Go
- 1.1.3 创建目录结构
- 1.2 java命令
- 1.3 编写命令行工具
- 1.4 测试本章代码
- 1.5 本章小结
1.1 准备工作
这里就不作说明了,看书就可以轻松完成。
1.2 java命令
问题:如何启动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是非标准选项。
1.3 编写命令行工具
先上代码,新建了一个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的new
- flag.Usage = printUsage给Usage赋值,flag是内部包,自带Usage
- flag.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表示返回值
Go 学习笔记:Println 与 Printf 的区别
Println :可以打印出字符串,和变量
Printf : 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整型变量和整型
a := 10
fmt.Println(a) //right
fmt.Println("abc") //right
fmt.Printf("%d",a) //right
fmt.Printf(a) //error
1.4 测试本章代码
在ch01目录下创建main.go文件,然后输入代码:
package main
import "fmt"
func main() {
cmd := parseCmd()
if (cmd.helpFlag || cmd.class == "") {
printUsage()
} else {
println("helpFlag==",cmd.helpFlag)
}
}
注:只为了测试一个-help功能
测试一
C:\Go\bin>go install jvmgo\ch01
# jvmgo/ch01
D:\go\workspace\src\jvmgo\ch01\main.go:3: imported and not used: "fmt"
说明:go语言没使用的import包的内容会编辑报错
测试二
package main
func main() {
cmd := parseCmd()
if (cmd.helpFlag || cmd.class == "") {
printUsage()
} else {
println("helpFlag==",cmd.helpFlag)
}
}
编译通过
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()函数捕获没有被解析的参数。
1.5 本章小结
搭建好开发环境,学习java命令用法,使用go语言编写一个简化版的命令行工具。