pythonからGo サブルーチンへの引数 文字列
byte列をポインターで渡す。
pcgo1.py
from ctypes import *
lib = cdll.LoadLibrary("./golib.so")
a=lib.fun1(c_char_p(b"hello world"))
golib.go
package main
import "C"
import "fmt"
//export fun1
func fun1(a *C.char) int {
fmt.Println(C.GoString(a))
return 0
}
func main() {}
コンパイルと実行
>go build -o golib.so -buildmode=c-shared golib.go
>python pcgo1.py
hello world
- c_char_p(b"hello world")は、バイト列ポインター扱い
- C.GoString(a)は、受け取ったバイト列ポインターをGO stringへ
#文字列の受け渡し
###基本的に文字列の受け渡しは、バイト列で行う。
py2go.py
from ctypes import *
#パラメータの準備
class go_string(Structure):
_fields_ = [("p", c_char_p),("n", c_int)]
#GO言語用string変換
def GoString(s):
u=s.encode('utf-8')
return go_string(c_char_p(u), len(u))
lib = cdll.LoadLibrary("./golib.so")
lib.fun1.restype=c_char_p
a=lib.fun1(c_char_p("こんにちは".encode('utf-8')))
lib.fun2.restype=c_char_p
b=lib.fun2(GoString("こんにちは"))
print("a=",a.decode('utf-8'))
print("b=",b.decode('utf-8'))
- encode/decodeは、それぞれバイト列変換です。
golib.go
package main
import "C"
import "fmt"
//export fun1
func fun1(a *C.char)*C.char{
fmt.Println("fun1",C.GoString(a)+" 日本")
return C.CString(C.GoString(a)+" 日本")
}
//export fun2
func fun2( a string)*C.char{
fmt.Println("fun2",a+" 日本")
return C.CString(a+" 日本")
}
func main() {}
コンパイルと実行結果
>go build -o golib.so -buildmode=c-shared golib.go
>python py2go.py
fun1 こんにちは 日本
fun2 こんにちは 日本
a= こんにちは 日本
b= こんにちは 日本
- fun1は、C言語ポインターで受け取りC言語ポインターで返す。
- fun2は、Go言語stringで受け取りC言語ポインターで返す。