美文网首页
一个重要的go代码模板

一个重要的go代码模板

作者: c4a1d989518e | 来源:发表于2018-03-21 14:03 被阅读28次

    涉及到格式转换,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 之间的相互转化

    相关文章

      网友评论

          本文标题:一个重要的go代码模板

          本文链接:https://www.haomeiwen.com/subject/iclgqftx.html