go语言实现的脚本

今天说是写脚本,具体来说应该是昨天写了一个脚本。起初我连脚本是什么都不清楚,更别提写了。在百度上也搜索了许多相关的知识,大多也都是说的我更加凌乱。下面来总结一下相关的问题:

我眼中的脚本

1.脚本和服务:脚本执行一次,服务一直执行

2.脚本用来做什么:我这次写的脚本就是帮助我完成代码的书写。其实脚本就是帮助你完成一件你需要一直重复做的事情。举个栗子~
你想打印数字,打印1再打印2再打印3。。。。。
这时候你会写一个for循环或者range,让后帮助你执行1000次,其实这就是一个脚本

3.脚本语言:脚本语言比较好的就像python、shell啥的吧。但其实我想说的是用你熟悉的语言都可以写出来。有机会我用python写一个再来说说心得啥的。

如何书写一个脚本

这里我那我写的脚本为例,脚本功能:批量调用另一个服务的接口
1.首先我们要清楚你实现的是什么功能,其次清楚你重复实现的这些有什么共同点(写死的那部分),什么是不同的(写成变量)

2.我这里拿批量调用另一个服务接口为例,调用一个接口和调用n个接口的区别在于:
(1)路由地址不同
(2)每个方法的名字不同
(3)调用的服务不同
(4)新建文件头不同(这里就是那个package xxx)
(5)新建文件的名字不同
(6)这里我加了个判断文件是否存在,那么这个判断地址也不同
注:脚本对所有类似问题做出解决,也许有时候会调用别的服务所以服务也是变量,在写脚本的时候尽量把可能的变量写全
3.实现:
(1)把所有需要的接口路由对应接口名字(这里的名字会作为每个方法名字的一部分)写成一个map
(2)定义上面所提到的变量包括:调用的服务、文件名等等
(3)写一个新建文件同时判断文件是否存在
(4)拥有一个模板代码(这里是指所有的共同点写成一个模板)
(5)用sprintf去拼接你的模板和变量
(6)遍历你的map
(7)遍历map的同时把每个map装进你的模板,你就拥有了调用很多接口的代码,接着为他们创建文件(这里就调用你上面写好的代码)
(8)完成啦~~~~~

4.附上代码:
功能:

  • 如果你想生成一堆有关于调用某个服务器的接口,请使用(文件会创建在当前的目录下,请自行拖走)
  • 需要提供的变量有
    (1) 两个map:分别表示有token和无token的handler(其中第一个参数为路由,第二个参数为生成函数的名字)
    (2) 四个string:t:新文件夹的头(即所在的包名),path1、path2:检查绝对地址下是否存在文件,m:需要调用的服务
  • 注:新建的文件名分别为token、un_token,没有放入变量,如有需要可以进行自行修改
func CreateHandle(_w http.ResponseWriter, _r *http.Request) {
    // 不需要验证
    untoken := map[string]string{
        "/register":         "Register",
        //等等,这里不做展示
    }
    // 需要验证
    token := map[string]string{
        "/login/xxxx":       "xxxxxx",
        // 等等这里不做展示
    }
    // 新建文件的头
    t := "package verify"
    // token文件新建位置(绝对地址)
    path1 := "/"
    // 无token文件新建位置(绝对地址)
    path2 := "/"
    // 调用的服务器
    m := "conf.SERVER_USER"
    // 循环遍历需要的接口(token)
    for key, value := range token {
        // 模板不做展示,根据自己需要书写即可
        t += fmt.Sprintf("\n" + "func " + value + "Handle(_w http.ResponseWriter, _r *http.Request) {......" +"\n")
    }
    // 建立文件夹并判断是否存在
    b, err := Create("token.go", t, path1)
    // 如果存在
    if b {
        fmt.Println("文件已存在")
        return
    }
    if err != nil {
        fmt.Println("文件创建错误:", err)
        return
    }
    // 附上新的文件头
    t = "package unverify"
    // 循环遍历需要的接口(无token)
    for key, value := range untoken {
        // 模板不做展示,根据自己需要书写即可
        t += fmt.Sprintf("\n" + "func " + value + "Handle(_w http.ResponseWriter, _r *http.Request) {......." +"\n")
    }
    // 建立文件夹并判断是否存在
    b, err = Create("un_token.go", t, path2)
    if b {
        fmt.Println("文件已存在")
        return
    }
    if err != nil {
        fmt.Println("文件创建错误:", err)
        return
    }
    httpcode.JsonOk(_w, nil)
    return
}
// 新建文件
func Create(fileName, s, path string) (bool, error) {
    // 根据位置查找是否存在
    _, err := os.Stat(path)
    if !os.IsNotExist(err) {
        return true, nil
    }
    if err == nil {
        return true, err
    }
    // 新建文件夹
    dstFile, err := os.Create(fileName)
    if err != nil {
        fmt.Println(err.Error())
        return false, err
    }
    defer dstFile.Close()
    dstFile.WriteString(s + "\n")
    return false, err
}

推荐阅读更多精彩内容