我们在开发过程中免不了要执行其他编程语言写的代码。下面通过几个例子来示示范。
一、命令行执行命令行并且输出结果:
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'
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函数
/*
int fibbonaci(int n){
if(n<=1)
return 1;
return fibbonaci(n-1)+fibbonaci(n-2);
}
*/
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)
}
/*
#include
*/
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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)