栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

GO操作其他编程语言代码-命令行,shell,C,python

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

GO操作其他编程语言代码-命令行,shell,C,python

我们在开发过程中免不了要执行其他编程语言写的代码。下面通过几个例子来示示范。

一、命令行

执行命令行并且输出结果:

func main()  {
	cmdStr:="ps"
	cmd:=exec.Command(cmdStr,"-ef")


	output,err:=cmd.Output()
	if err!=nil{
		panic(err)
	}
	fmt.Println("get %s result:n",string(output))

}

执行命令行但是不需要输出结果:

func main()  {
	cmdStr:="touch"
	cmd:=exec.Command(cmdStr,"./maintest.log")
	if err:=cmd.Run();err!=nil{
		panic(err)
	}
	
}

二、shell

比如我们有这么一个脚本echo_hello.sh:

#!/bin/sh
echo 'hello my friend' $1

func main()  {
	cmdStr:="/bin/bash"
	cmd:=exec.Command(cmdStr,"echo_hello.sh","'Green Peter'")
	if out,err:=cmd.Output();err!=nil{
		panic(err)
	}else{
		fmt.Println("get result:n",string(out))
	}

}

三、C语言

打印hello world

package main


//#include
import "C"



func main()  {
	C.puts(C.CString("hello,world!"))
}

值得注意的是C代码应当在import "C"紧挨着。

或者是调用一个C函数


import "C"
import "fmt"

func main()  {
	ret:=C.fibbonaci(20)
	fmt.Println(ret)
}

甚至可以用GO语言实现c语言的接口然后调用

//mymath.h

int factory(int n);
//mymath.go

import "C"


//export factory
func factory(n int) int {
	if n<=1{
		return 1
	}
	return n*factory(n-1)
}

import "C"
import "fmt"

func main()  {
	ret:=C.factory(10)
	fmt.Println(ret)
}

也可以使用C语言的静态库。把我们之前用到的mymath.h放到名为mymath的目录下,然后新建一个.c文件实现它:

#include "mymath.h"

int factory(int n){
    if(n<=1) return 1;
    return n*factory(n-1);
}

然后执行

gcc -c -o mymath.o mymath.c && ar rcs libmymath.a mymath.o

把代码打包成静态库。成功之后目录结构是这样的:

然后编写go文件时要加上CGO标志

//#cgo CFLAGS: -I ./mymath
//#cgo LDFLAGS: -L ./mymath -lmymath
//#include "mymath.h"
import "C"
import "fmt"

func main()  {
	ret:=C.factory(10)
	fmt.Println(ret)
}

我们用GO也可实现c语言接口,并且打包成静态库。

package main


import "C"

func main()  {

}

//export factory
func factory(n int) int {
	if n<=1{
		return 1
	}
	return n*factory(n-1)
}

注意mymath.h也是在这个目录下的

然后执行:go build -buildmode=c-archive -o libmymath.a

能得到libmymath.a     libmymath.h两个文件

四、调用python

如果已经有python脚本写好了,那么我们确实可以用执行命令行的仿石漆去执行python脚本,这里讲一种直接调用一个python子模块的方式。

首先安装go-python

go get github.com/sbinet/go-python

然后需要把环境变量设置好

让python在对应目录执行,方便找到对应模块 

 

import (
	"fmt"
	"github.com/sbinet/go-python"
)

func getFibonacciByPython(n int) (int,error) {
	python.Initialize()//初始化
	defer python.Finalize()

	fibModule:=python.PyImport_ImportModule("fib")//加载模块
	if fibModule==nil{
		return 0,fmt.Errorf("import fib error")
	}


	fiboFunc:=fibModule.GetAttrString("fibo")//加载函数
	if fiboFunc==nil{
		return 0,fmt.Errorf("method fibo not found")
	}

	out:=fiboFunc.CallFunction(python.PyInt_FromLong(n))
	if out==nil{
		return 0,fmt.Errorf("call fibo return value error")
	}

	ret:=python.PyInt_AsLong(out)
	return ret,nil
}
func main()  {
	ret,err:=getFibonacciByPython(26)
	if err!=nil{
		panic(err)
	}
	fmt.Println(ret)
}

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906831.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号