2017年3月4日土曜日

golang でコマンドをコールする

概要

golang でコマンドをコールするユーティリティ的なのを作成してみました
備忘録のため残しておきます

環境

  • CentOS 6.7 64bit
  • golang 1.6

サンプルコード

package main

import (
    "fmt"
    "os/exec"
)

type Cmd struct {
    cmd    string
    args   []string
    result string
}

func (cc *Cmd) execute() (err error) {
    out, err := exec.Command(cc.cmd, cc.args[0:]...).CombinedOutput()
    if err != nil {
        return err
    }
    cc.result = saveResult(out)
    return nil
}

func saveResult(out []byte) (ret string) {
    return string(out)
}

func newCmd(cmd string, args []string) (cc *Cmd) {
    cc = new(Cmd)
    cc.cmd = cmd
    cc.args = args
    return cc
}

func NewEchoCmd(output []string) (cc *Cmd) {
    return newCmd("echo", output)
}

func main() {
    args := []string{"hoge", "fuga"}
    cc := NewEchoCmd(args)
    err := cc.execute()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(cc.result)
    fmt.Println("end")
}

最後に

コマンドを実行する専用のメソッドを作成することでコマンドを制限する感じにしています
execute したあとに結果が result に全部入るので、結果のパースは result に値が入ったあとにやる感じになります
本当は結果をパースするメソッドも作成して、コマンドに応じて必要な情報を取得できるようにしたかったのですが、いろいろと嵌りそうだったのでやめました

0 件のコメント:

コメントを投稿