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

GO *** 作其他编程语言代码-命令行,shell,C,python,第1张

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

一、命令行

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

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)
}

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存