一个重要的go代码模板

2018-03-21  本文已影响28人  c4a1d989518e

涉及到格式转换,json与map转换,和执行命令行命令

package main

import (
    "fmt"
    "reflect"
    "os/exec"
    "github.com/bitly/go-simplejson"
    "encoding/json"
    "io/ioutil"
    "log"
)


var DEPLOY=`{
    "public":{
        "server-pos":{
            "dev":{"auto_deploy":0, "tag":"develop", "host":["100.100.100.100"],"extend":["event"]}
        },
        "mmmm":{
                "dev":{"auto_deploy":0, "tag":"develop", "host":["100.100.100.100"]}
            },
        "medmed":{
                "dev":{"auto_deploy":0, "tag":"develop", "host":["100.100.100.100"]}
            },
        "titi":{
                "dev":{"auto_deploy":0, "tag":"develop", "host":["100.100.100.100"]}
            },
        "haha":{
                "dev":{"auto_deploy":0, "tag":"develop", "host":["100.100.100.100"]}
            },
        "hihi":{
                "dev":{"auto_deploy":0, "tag":"cloud", "host":["100.100.100.100"]}
            },
        "hehe":{
                "dev":{"auto_deploy":0, "tag":"nn", "host":["100.100.100.100"]}
            }
    },
    "dd":{
        "dd-server":{
                "dev":{"auto_deploy":0, "tag":"master", "host":["100.100.100.100"]}
        },
        "dd-promotion":{
                "dev":{"auto_deploy":0, "tag":"made", "host":["100.100.100.100"]}
            },
        "nn-server":{
                "dev":{"auto_deploy":0, "tag":"develop", "host":["100.100.100.100"],"extend":["dd-event","dd-task"]}
            },
        "dd-web":{
                "dev":{"auto_deploy":0, "tag":"gateway", "host":["100.100.100.100"]}
            },
        "dd-nn":{
                "dev":{"auto_deploy":0, "tag":"develop", "host":["100.100.100.100"]}
            },
        "my-way":{
                "dev":{"auto_deploy":0, "tag":"develop", "host":["100.100.100.100"]}
            }
    },
    "ceshi":{
        "my_test":{
                "dev":{"auto_deploy":0, "tag":"master", "host":["100.100.100.100"]}
        },
        "my_test_python":{
                "dev":{"auto_deploy":0, "tag":"made", "host":["100.100.100.100"]}
            }
        }
}`

//需要大写
type Change struct{
    Auto_deploy int32
    Tag string
    Host []string
}

func main() {
    //simplejson是一个处理json简易的第三方包
    DEPLOY_Json, err := simplejson.NewJson([]byte(DEPLOY)) //反序列化
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(reflect.TypeOf(DEPLOY_Json))
    //这一步是将simplejson转换为map
    DEPLOY_Map,_ :=DEPLOY_Json.Map()
    
    for project,_ := range DEPLOY_Map{
        project_info:=DEPLOY_Map[project]
        //将interface转换为map
        project_info_new:=project_info.(map[string]interface{})
        ab:="my_test"
        //判断map中key值是否存在
        if v, ok := project_info_new[ab]; ok {
            value :=v.(map[string]interface{})
            for env,env_info :=range value{
                fmt.Println(env)
                env_info_new:=env_info.(map[string]interface{})
                //序列化,map[string]interface{}转化为json类型
                cc,err :=json.Marshal(env_info_new)
                if err !=nil{
                    fmt.Println("cc not")
                }else{
                    fmt.Println("cc exist")
                }
                var msg Change
                //反序列化,json转化为struct类型
                json.Unmarshal([]byte(cc),&msg)
                v:=reflect.ValueOf(msg)
                //下面这三步是将reflect.Value转化为int类型
                x:=v.Field(0)
                y:=x.Interface()
                i:=y.(int32)
                if i==0{
                    fmt.Println("success")
                    project_name:="myproject"
                    //字符串拼接
                    s:= fmt.Sprintf("项目:%s,环境: %s,正在发布,请稍等",project_name,env)
                    fmt.Println(s)
                    //判断env_info_new中的key值是否存在
                    if _, ok := env_info_new["tag"]; ok {
                        fmt.Println("exist")
                        //以下,到输出结果,都是执行系统命令,并输出结果
                        cmd := exec.Command("ls", "-a" )
                        stdout, err := cmd.StdoutPipe()
                        if err != nil {
                            log.Fatal(err)
                        }
                        // 保证关闭输出流
                        defer stdout.Close()
                        // 运行命令
                        if err := cmd.Start(); err != nil {
                            log.Fatal(err)
                        }
                        // 读取输出结果
                        opBytes, err := ioutil.ReadAll(stdout)
                        if err != nil {
                            log.Fatal(err)
                        }
                        log.Println(string(opBytes))
                    }
                }

            }
        } else {
            fmt.Println("Key Not Found")
        }
    }
}


参考文章

golang解析创建复杂嵌套的json数据

GoLang中 json、map、struct 之间的相互转化

上一篇下一篇

猜你喜欢

热点阅读