在Golang中访问C数组 [英] Accessing C array in golang

查看:293
本文介绍了在Golang中访问C数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个文件, module.go test.py 。我的目标是加快一些在python中完成的计算,但是在访问go中的整数数组时遇到问题。

I have two files, module.go and test.py. My goal is to speed up some calculations that is done in python, but have an issue accessing array of integers in go.

module.go

package main

import "C"

//export Example
func Example(testArray []C.int) C.int {
    return testArray[2]
}

func main() {}

和python中的简单测试文件:

and simple test file in python:

from ctypes import *

# Load compiled go module
lib = cdll.LoadLibrary("./gomodule.so")
# We are passing an array of 256 elements and recieving integer
lib.Example.argtypes = [c_int * 256]
lib.Example.restype = c_int
pyarr = [x for x in range(256)]
# Make C array from py array
arr = (c_int * len(pyarr))(*pyarr)
print lib.Example(arr)

使用编译go模块后,请执行build -buildmode = c-shared -o gomodule.so模块。走并启动我得到的python文件:

After compiling go module with go build -buildmode=c-shared -o gomodule.so module.go and fire up python file I got:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x12 pc=0x7fb18b6e688c]

goroutine 17 [running, locked to thread]:
main.Example(...)
        /home/metro/go/src/github.com/golubaca/carinago/module.go:7
main._cgoexpwrap_53c1c00d0ad3_Example(0xa, 0x7fff33a2eac0, 0x7fff33a2ea70, 0x722a921de6cae100)
        _cgo_gotypes.go:47 +0x1c
Aborted (core dumped)

我知道C数组与Go有所不同,但是找不到任何教程如何在没有恐慌的情况下访问它的值。 / p>

I get that C array is different from Go, but can't find any tutorial how to access it's values without panic.

推荐答案

这是惯用的,有效的Go解决方案(避免反射)。

This is the idiomatic, efficient Go solution (avoid reflection).

module.go

package main

import "C"

import "unsafe"

//export Example
func Example(cArray *C.int, cSize C.int, i C.int) C.int {
    gSlice := (*[1 << 30]C.int)(unsafe.Pointer(cArray))[:cSize:cSize]
    return gSlice[i]
}

func main() {}

test.py

from ctypes import *

# Load compiled go module
lib = cdll.LoadLibrary("./gomodule.so")
# We are passing an array of 256 elements and receiving an integer
lib.Example.argtypes = [c_int * 256]
lib.Example.restype = c_int
pyarr = [x for x in range(256)]
# Make C array from py array
arr = (c_int * len(pyarr))(*pyarr)
print lib.Example(arr, len(arr), 4)

输出:

$ go build -buildmode=c-shared -o gomodule.so module.go
$ python test.py
4
$ 

这篇关于在Golang中访问C数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆