命令行的使用cli

该博客介绍了如何使用Golang为程序添加命令行接口,以创建、添加区块和打印区块链。通过定义CLI结构体,实现了处理用户输入并根据不同的命令调用相应功能,如创建区块链、添加区块和打印区块链。文章还包含了错误处理和使用说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Golang 命令行的使用cli

为程序添加命令行启用的方法

  1. 新建源程序在其中添加一个结构体

    // 处理用户输入命令,完成具体函数的调用
    // cli : command line 命令行
    type CLI struct {
    	// 不需要字段
    }
    
    // 使用说明,帮助用户正确使用
    const Usage = `
    Usage:
    	./blockchain create "创建区块链"
    	./blockchain addBlock <需要写入的数据> "添加区块"
    	./blockchain print "打印区块链"
    `
    
  2. 添加使用说明

  3. 为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()
    }
    
  4. 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
    		}
    	}
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值