go 语言命令行程序

// lab3 project main.go
// minglinghang project main.go
package main

import (
    "fmt"
    "math"
    "os"
    "strings"
    "unsafe"
)

func add() {
    var firstNum, secondNum int

    //fmt.Println("Please input two integers: ")
    fmt.Scanln(&firstNum, &secondNum)

    fmt.Printf("%d + %d = %d\n", firstNum, secondNum, firstNum+secondNum)
}

func help() {
    ShowAllCommand(list)
}

func sub() {
    var firstNum, secondNum int

    //fmt.Println("Please input two integers: ")
    fmt.Scanln(&firstNum, &secondNum)

    fmt.Printf("%d - %d = %d\n", firstNum, secondNum, firstNum-secondNum)
}

func mul() {
    var firstNum, secondNum int

    //fmt.Println("Please input two integers: ")
    fmt.Scanln(&firstNum, &secondNum)

    fmt.Printf("%d * %d = %d\n", firstNum, secondNum, firstNum*secondNum)
}

func div() {
    var firstNum, secondNum int

    //fmt.Println("Please input two integers: ")
    fmt.Scanln(&firstNum, &secondNum)

    fmt.Printf("%d / %d = %.2f\n", firstNum, secondNum, float64(firstNum)/float64(secondNum))
}

func pow() {
    var firstNum, secondNum int

    //fmt.Println("Please input two integers: ")
    fmt.Scanln(&firstNum, &secondNum)

    fmt.Printf("%d ^ %d = %.0f\n", firstNum, secondNum, math.Pow(float64(firstNum), float64(secondNum)))
}

func mod() {
    var firstNum, secondNum int

    //fmt.Println("Please input two integers: ")
    fmt.Scanln(&firstNum, &secondNum)

    fmt.Printf("%d mod %d = %d\n", firstNum, secondNum, firstNum%secondNum)
}

func quit() {
    os.Exit(1)
}

type DataNode struct {
    next *DataNode
    cmd string
    desc string
    handler func()
}

type linknode struct {
    next *linknode
}

type linklist struct {
    head *linknode
    tail *linknode
}

func CreateLinklist() *linklist {
    return &linklist{}
}

func AddNode(list *linklist, newnode *linknode) {
    if list.head == nil {
        list.head = newnode
        list.tail = list.head
    } else {
        list.tail.next = newnode
        list.tail = newnode
    }
}
func ShowAllCommand(list *linklist) {
    for node := list.head; node != nil; node = node.next {
        tmp := (*DataNode)(unsafe.Pointer(node))
        fmt.Printf("%s - %s\n", tmp.cmd, tmp.desc)
    }
}

func searchcondition(node *DataNode, cmd interface{}) bool {
    str := cmd.(string)

    //if strings.Compare(str, node.cmd) {
    if node.cmd == str {
        return true
    } else {
        return false
    }
}
func search(list *linklist, cmd string) *DataNode {
    for node := list.head; node != nil; node = node.next {
        tmp := (*DataNode)(unsafe.Pointer(node))
        if searchcondition(tmp, cmd) {
            return tmp
        }
    }
    return (*DataNode)(unsafe.Pointer(list.head))
}
func Init(list *linklist) {
    menuconfig(list, "help", "this is help cmd", help)
    menuconfig(list, "add", "this is add cmd", add)
    menuconfig(list, "sub", "this is sub cmd", sub)
    menuconfig(list, "mul", "this is mul cmd", mul)
    menuconfig(list, "div", "this is div cmd", div)
    menuconfig(list, "mod", "this is mod cmd", mod)
    menuconfig(list, "pow", "this is pow cmd", pow)
    menuconfig(list, "quit", "this is quit cmd", quit)
    /*node := &DataNode{nil, "help", "this is help cmd", help}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
    node := &DataNode{nil, "add", "this is add cmd", add}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
    node = &DataNode{nil, "sub", "this is sub cmd", sub}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
    node = &DataNode{nil, "mul", "this is mul cmd", mul}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
    node = &DataNode{nil, "div", "this is div cmd", div}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
    node = &DataNode{nil, "mod", "this is mod cmd", mod}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
    node = &DataNode{nil, "pow", "this is pow cmd", pow}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
    node = &DataNode{nil, "quit", "this is squit cmd", quit}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
    */
}

func menuconfig(list *linklist, cmd string, desc string, handler func()) {
    node := &DataNode{nil, cmd, desc, handler}
    AddNode(list, (*linknode)(unsafe.Pointer(node)))
}

const CMD_LENTH = 10

func Excutemenu(list *linklist) {
    for {
        var argc int = 0
        var cmdi string
        var arg [5]string
        fmt.Println("Input a cmd number >")
        fmt.Scanf("%s", &cmdi)
        var cmdis []string = strings.Split(cmdi, " ")
        for (argc < len(cmdis)) && argc < CMD_LENTH {
            arg[argc] = cmdis[argc]
            argc = argc + 1
        }
        node := search(list, arg[0])
        if node != nil {
            node.handler()
        } else {
            fmt.Printf("this is a wrong cmd ")
        }
    }

}

var list *linklist

func main() {
    list = CreateLinklist()
    Init(list)
    Excutemenu(list)

}
				
时间: 2024-10-10 10:31:56

go 语言命令行程序的相关文章

【CMD】如何批量调用命令行程序

最近在研究守望先锋的解包,然后中途有一个步骤,将00C文件通过一个命令行程序转为obj格式. 但是我遇到一个问题,这个命令行程序一次只能转换一个文件,而00C文件足足有7400个以上,这就难倒我了. 固然这个命令行程序有着源码,但是对于比较弱鸡的我来说,没有什么办法. 后来在朋友的指点下,发现了解决办法,因此在此分享给大家. 在CMD中,有类似于其他语言的for的命令. 其用法是: for %变量 IN (文件通配符) DO (要做的事情) 对于我来用的话,就是这样的 for %i IN (*.

详解NodeJS和命令行程序

源起 植根于Unix系统环境下的程序,很多都把贯彻Unix系统设计的哲学作为一种追求.Unix系统管道机制的发明者Douglas McIlroy把Unix哲学总结为三点: 专注做一件事,并做到极致.程序协同工作.面向通用接口,如文本数据流.随着Unix/Linux系统在服务器上影响力越发强大,以及各种跨平台解决方案的发展,这种哲学也被带到了各种平台上.若干年前,笔者第一次接触NodeJS和其包管理解决方案NPM时候,就感觉到其官方倡导的风格,和Unix系统哲学非常契合.近年来,随着NodeJS在

Java命令行程序构建工具-airline

以前对于开发Java命令行程序,我都是很头大的,命令行程序麻烦的是解析参数,以及一些帮助信息,今天在研究接口测试时偶然发现了一个工具可以让你快速构建命令行程序 github地址 airline 导入jar包 airline jar 在maven仓库里搜索适合你构建系统的语句 代码 我找了个解析har文件的项目,来讲解开发过程 定制自己的命令行 我的命令行以doctorq作为命令,参数为company,命令的完整格式应该为doctorq company XXXXX. @Command(name="

如何使用Docker实现PHP命令行程序的CI/CD?

本文标签: Docker PHP命令行程序的CI/CD Codeship 内容要点: - 使用Jet设置环境并在本地运行测试 - 配置CodeshipPro每次新代码提交时,自动运行测试 - 上一步的测试通过后,自动将更新部署到服务器 持续集成 应用程序和测试套件已经在本地运行,下一步要做的是建立一些持续集成系统.虽然可以设置服务器来执行此操作,但这个过程工作量略大,因此推荐一个像CodeshipPro的服务. 使用Jet进行本地测试 代码提交到Codeship测试前,建议先安装其本地版本的持续

Node.js 命令行程序开发教程

nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html 基于node构建命令行工具

软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序

软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 -c 统计文件字符数支持 -w 统计文件单词数支持 -l 统计文件总行数 2.拓展功能 支持 -a 返回高级选项(代码行 空行 注释行)支持 -s 递归处理符合条件的文件 3.高级功能 支持 -x 程序以图形界面与用户交互 [filename] 是

命令行程序增加 GUI 外壳

Conmajia ? 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 GUI 外壳的命令行程序 程序思路是这样的: 通过运行 cmd.exe 来操作命令行,现在要给它一个 GUI. Windows 的命令行 cmd.exe \(\rightarrow\) 新进程 Process \(\rightarrow\) WinForm \(\rightarrow\) GUI 这

实现一个自动生成小学四则运算题目的命令行程序

Github项目地址:https://github.com/sumilekaedei/Myapp.git 题目:实现一个自动生成小学四则运算题目的命令行程序. 自然数:0, 1, 2, -. 真分数:1/2, 1/3, 2/3, 1/4, 1'1/2, -. 运算符:+, ?, ×, ÷. 括号:(, ). 等号:=. 分隔符:空格(用于四则运算符和等号前后). 算术表达式: e = n | e1 + e2 | e1 ? e2 | e1 × e2 | e1 ÷ e2 | (e), 其中e, e1

golang实现命令行程序的使用帮助

通过flag包我们可以很方便的实现命令行程序的参数标志,接下来我们来看看如何实现命令行程序的使用帮助,通常以参数标志-h或--help的形式来使用. 自动生成使用帮助 我们只需要声明其他参数标志,并执行解析,flag包会帮我们自动生成使用帮助. //main.go //输出2个数,输出较大的数 package main import ( "flag" "fmt" "math" ) func main() { firstFlag := flag.F