Golang 命令行的使用cli
为程序添加命令行启用的方法
-
新建源程序在其中添加一个结构体
// 处理用户输入命令,完成具体函数的调用 // cli : command line 命令行 type CLI struct { // 不需要字段 } // 使用说明,帮助用户正确使用 const Usage = ` Usage: ./blockchain create "创建区块链" ./blockchain addBlock <需要写入的数据> "添加区块" ./blockchain print "打印区块链" `
-
添加使用说明
-
为cli添加一个方法Run,主函数只调用这个方法即可
// 负责解析命令的方法 func (cli *CLI) Run() { cmds := os.Args // 用户至少输入两个参数 if len(cmds) < 2 { fmt.Println("输入参数无效,请检查!") fmt.Println(Usage) return } switch cmds[1] { case "create": fmt.Println("创建区块被调用!") cli.createBlockChain() case "addBlock": if len(cmds) != 3 { fmt.Println("输入参数无效,请检查!") return } fmt.Println("添加区块被调用!") data := cmds[2] // 需要校验个数 cli.addBlock(data) case "print": fmt.Println("打印区块被调用!") //TODO cli.print() default: fmt.Println("输入参数无效,请检查!") fmt.Println(Usage) } }
Main.go
func main() { cli := CLI{} cli.Run() }
-
Run函数中的一些方法需要绑定给cli结构体
package main import "fmt" func (cli *CLI) addBlock(data string) { bc, err := GetBlockChainInstance() if err != nil { fmt.Println("GetBlockChainInstance error:", err) return } err = bc.AddBlock(data) if err != nil { fmt.Println("AddBlock error:", err) return } fmt.Println("添加区块成功!") } func (cli *CLI) createBlockChain() { err := CreateBlockChain() if err != nil { fmt.Println("CreateBlockChain error:", err) return } fmt.Println("创建区块链成功!") } func (cli *CLI) print() { bc, err := GetBlockChainInstance() if err != nil { fmt.Println("GetBlockChainInstance error:", err) return } //调用迭代器,输出blockChain it := bc.NewIterator() for { //调用Next方法,获取区块,游标左移 block := it.Next() fmt.Printf("\n++++++++++++++++++++++\n") fmt.Printf("Version : %d\n", block.Version) fmt.Printf("PrevHash : %x\n", block.PrevHash) fmt.Printf("MerkleRoot : %x\n", block.MerkleRoot) fmt.Printf("TimeStamp : %d\n", block.TimeStamp) fmt.Printf("Bits : %d\n", block.Bits) fmt.Printf("Nonce : %d\n", block.Nonce) fmt.Printf("Hash : %x\n", block.Hash) fmt.Printf("Data : %s\n", block.Data) pow := NewProofOfWork(block) fmt.Printf("IsValid: %v\n", pow.IsValid()) //退出条件 if block.PrevHash == nil { fmt.Println("区块链遍历结束!") break } } }