LoginSignup
2
2

More than 3 years have passed since last update.

眺めて覚えるGo言語 その8 PythonからGO言語を呼ぶ1(引数文字列)

Posted at

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言語ポインターで返す。
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2