前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言cmd命令通过管道实现交互

Go语言cmd命令通过管道实现交互

作者头像
企鹅号小编
发布2018-01-23 09:39:12
3.1K0
发布2018-01-23 09:39:12
举报
文章被收录于专栏:编程编程

Go语言cmd命令通过管道实现交互

Go语言cmd命令通过管道实现交互

由于对于技术的追新欲望,让我想要把现有的一些逻辑在新技术上尝试。因此拿了一个在python上实现好的功能,翻到go中进行实现。在Python实现这种交互很简单使用popen2就可以简单实现。但是Go语言如何实现呢?接下来我就给大家实现此功能。

为什么需要这种交互

在公司里开发涉及到围棋领域AI的对接,一种通用的方式就是通过Go Text Protocol协议与不同AI进行对接,下文将以对接一种AI(gungo)进行样例说明。现在让我们进入正题吧……

接下来将使用exec.Cmd进行以上功能实现。首先通读一次exec.Cmd的文档实现各种各个方法的实现。从中找到cmd.StdinPipe,cmd.StdoutPipe基本可以定位实现的方式了。话不多说下面上代码……

// GTP_Connection GTP连接类管理

typeGTPConnectionstruct{

cmd *exec.Cmd

infile io.WriteCloser

outfile io.ReadCloser

}

首先定义一个实现类,用于后续交互其中有三个属性分别是cmd用于命令对象保存,infile为输入管道,outfile为输出管道。

// NewConnection 创建GTP连接

funcNewConnection(cmdstring, args ...string) (*GTPConnection,error) {

conn:= GTPConnection{}

conn.cmd= exec.Command(cmd, args...)

inf,err:= conn.cmd.StdinPipe()

iferr !=nil{

return&conn, err

}

outf,err:= conn.cmd.StdoutPipe()

iferr !=nil{

return&conn, err

}

conn.infile= inf

conn.outfile= outf

conn.cmd.Start()

gofunc() {

conn.cmd.Wait()

}()

return&conn,nil

}

创建命令,并得到输入输出管道,cmd.Start()开始命令,cmd.Wait()等待命令结束,需要使用go异步化,不然会阻塞程序执行。

// Exec 执行GTP命令

func(self GTPConnection)Exec(cmdstring) (string,error) {

self.infile.Write([]byte(fmt.Sprintf("%s\n", cmd)))

reader:= bufio.NewReader(self.outfile)

result:=""

for{

line,err2:= reader.ReadString('\n')

iferr2 !=nilio.EOF == err2 {

break

}

ifline =="\n"{

break

}

result += line

}

res:= strings.Split(result,"")

l:=len(res)

ifres[l-1] =="\n"{

result= strings.Join(res[:l-1],"")

}

iflen(result) =={

return"", errors.New("len =0")

}

ifres[] =="?"{

return"", errors.New(fmt.Sprintf("ERROR: GTP Command failed:%s", strings.Join(res[2:],"")))

}

ifres[] =="="{

returnstrings.Join(res[2:],""),nil

}

return"", errors.New(fmt.Sprintf("ERROR: Unrecognized answer: %s", result))

}

执行方法,首先通过输入管道执行命令,再通过输出管道得到响应结果

本文来自企鹅号 - 弈客技术学习班媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 弈客技术学习班媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档