今天说是写脚本,具体来说应该是昨天写了一个脚本。起初我连脚本是什么都不清楚,更别提写了。在百度上也搜索了许多相关的知识,大多也都是说的我更加凌乱。下面来总结一下相关的问题:
我眼中的脚本
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
}
网友评论