实例编程:多语言学语言学调用Golang共享库
发布时间:2025/11/23 12:17 来源:裕安家居装修网
最后,将程序里简介如何从其他第二语言初始化基本概念的数组。
C初始化有两种方式可以用作提供人者努从C初始化Go数组:
预定义可以在转译时与提供人者努实例COM,但在列车运行时自适应链接。
Golang数组在列车运行时自适应读取和COM。
自适应链接在这种方式里,我们用作头明文来实例提到提供人者普通人明文里基本概念的类别和数组。 预定义简单干净如下三幅(以外打印语句省略):
#include #include "chongchong.h"int main() { GoInt a = 12; GoInt b = 99; printf("chongchong.Add(12,99) = %d", Add(a, b)); printf("chongchong.Cosine(1) = %f", (float)(Cosine(1.0))); GoInt data[6] = {77, 12, 5, 99, 28, 23}; GoSlice nums = {data, 6, 6}; Sort(nums); for (int i = 0; i < 6; i++){ printf("%d,", ((GoInt *)nums.data)[i]); } GoString msg = {"Hello from C!", 13}; Log(msg); }最后转译预定义,指定提供人者普通人努:
gcc -o example cc.c ./chongchong.so报错
c.c: In function ‘main’:cc.c:12: error: ‘for’ loop initial declarations are only allowed in C99 modecc.c:12: note: use option -std=c99 or -std=gnu99 to compile your code根据提示,我们附加-std=gnu99可选再进行转译
gcc -o example cc.c ./chongchong.so -std=gnu99然后分派程序
./example
,浮点数链接到chongchong.so努,归因于后面的编码器。
chongchong.Add(12,99) = 111chongchong.Cosine(1) = 0.540302Hello from C!5,12,23,28,77,99, 自适应读取在这种方式里,C预定义用作自适应链接读取程序努(libdl.so) 自适应读取并COM到基本概念的小写。 用作并不一定在dhfcn.h如dlopen打开努明文,用dlsym读取小写, dlerror检索错误,最后用dlclose关闭提供人者努明文。
#include # include #include typedef long long go_int; typedef double go_float64; typedef struct{ void *arr; go_int len; go_int cap;} go_slice; typedef struct{const char *p; go_int len;} go_str; int main(int argc, char **argv) { void *handle; char *error; handle = dlopen ("./chongchong.so", RTLD_LAZY); if (!handle) { fputs (dlerror(), stderr); exit(1); } go_int (*add)(go_int, go_int) = dlsym(handle, "Add"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } go_int sum = (*add)(12, 99); printf("chongchong.Add(12, 99) = %d", sum); go_float64 (*cosine)(go_float64) = dlsym(handle, "Cosine"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } go_float64 cos = (*cosine)(1.0); printf("chongchong.Cosine(1) = %f", cos); void (*sort)(go_slice) = dlsym(handle, "Sort"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } go_int data[5] = {44,23,7,66,2}; go_slice nums = {data, 5, 5}; sort(nums); printf("chongchong.Sort(44,23,7,66,2): "); for (int i = 0; i < 5; i++){ printf("%d,", ((go_int *)data)[i]); } printf(""); go_int (*log)(go_str) = dlsym(handle, "Log"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } go_str msg = {"Hello from C!", 13}; log(msg); dlclose(handle); }在上述预定义里自订了C类别:go_int,go_float,go_slice和go_str。用dlsym数组读取数组小写并将它们分配给各自的数组指针。然后转译预定义:
gcc -o example1 cc1.c -ldl -std=gnu99分派预定义时,C 浮点数明文读取并链接到提供人者努chongchong.so归因于以下编码器:
./example1chongchong.Add(12, 99) = 111chongchong.Cosine(1) = 0.540302chongchong.Sort(44,23,7,66,2): 2,7,23,44,66,Hello from C! PythonPython里,初始化C提供人者努易于,可以用作ctypes努初始化基本概念的Go数组,如后面的预定义片段标明。
from 曲在future曲在 import print_functionfrom ctypes import *lib = cdll.LoadLibrary("./chongchong.so")lib.Add.argtypes = [c_longlong, c_longlong]lib.Add.restype = c_longlongprint("chongchong.Add(12,99) = %d" % lib.Add(12,99))lib.Cosine.argtypes = [c_double]lib.Cosine.restype = c_doubleprint("chongchong.Cosine(1) = %f" % lib.Cosine(1))class GoSlice(Structure):_fields_ = [("data", POINTER(c_void_p)), ("len", c_longlong), ("cap", c_longlong)]nums = GoSlice((c_void_p * 5)(74, 4, 122, 9, 12), 5, 5)lib.Sort.argtypes = [GoSlice]lib.Sort.restype = Nonelib.Sort(nums)print("chongchong.Sort(74,4,122,9,12) = %s" % [nums.data[i] for i in range(nums.len)])class GoString(Structure):_fields_ = [("p", c_char_p), ("n", c_longlong)]lib.Log.argtypes = [GoString]lib.Log.restype = c_longlongmsg = GoString(b"Hello Python!", 13)这 lib函数问到从提供人者目标明文读取的小写。 Python类 GoString和 GoSlice给定到它们各自的 C 内部结构类别。 分派 Python 预定义时,它才会初始化提供人者普通人里的 Go 数组,归因于以下编码器:
python cc.pychongchong.Add(12,99) = 111chongchong.Cosine(1) = 0.540302chongchong.Sort(74,4,122,9,12) = [4, 9, 12, 74, 122]Hello Python! rubyRuby里调oG数组和Python也十分相似,用作FFI gem自适应读取和初始化基本概念的Go数组,如后面的预定义片段标明。
require 'ffi'module Ccextend FFI::Libraryffi_lib './chongchong.so'# define class GoSlice to map to:# C type struct { void *data; GoInt len; GoInt cap; }class GoSlice < FFI::Structlayout :data, :pointer,:len, :long_long,:cap, :long_longendclass GoString < FFI::Structlayout :p, :pointer,:len, :long_longendattach_function :Add, [:long_long, :long_long], :long_longattach_function :Cosine, [:double], :doubleattach_function :Sort, [GoSlice.by_value], :voidattach_function :Log, [GoString.by_value], :intendprint "chongchong.Add(12, 99) = ", Cc.Add(12, 99), ""print "chongchong.Cosine(1) = ", Cc.Cosine(1), ""nums = [92,101,3,44,7]ptr = FFI::MemoryPointer.new :long_long, nums.sizeptr.write_array_of_long_long numsslice = Chongchong::GoSlice.newslice[:data] = ptrslice[:len] = nums.sizeslice[:cap] = nums.sizeCc.Sort(slice)sorted = slice[:data].read_array_of_long_long nums.sizeprint "chongchong.Sort(", nums, ") = ", sorted, ""msg = "Hello Ruby!"gostr = Cc::GoString.newgostr[:p] = FFI::MemoryPointer.from_string(msg)gostr[:len] = msg.size在Ruby里,FFI::libraryclass被扩张为声明一个读取基本概念小写的类。GoSlice和GoString类给定到它们各自的C内部结构。当列车运行预定义时,它才会初始化基本概念的Go数组,如下标明:
ruby cc.rbchongchong.Add(12,99) = 111chongchong.Cosine(1) = 0.540302chongchong.Sort(74,4,122,9,12) = [4, 9, 12, 74, 122]Hello Ruby! node.jsNode 用作一个名为的内部数组努node-ffi(和其他依赖努)自适应读取和初始化基本概念的Go数组,如后面的预定义片段标明:
require 'ffi'# Module that represents shared libmodule Ccextend FFI::Libraryffi_lib './chongchong.so'class GoSlice < FFI::Structlayout :data, :pointer,:len, :long_long,:cap, :long_longendclass GoString < FFI::Structlayout :p, :pointer,:len, :long_longendattach_function :Add, [:long_long, :long_long], :long_longattach_function :Cosine, [:double], :doubleattach_function :Sort, [GoSlice.by_value], :voidattach_function :Log, [GoString.by_value], :intendprint "chongchong.Add(12, 99) = ", Cc.Add(12, 99), ""print "chongchong.Cosine(1) = ", Cc.Cosine(1), ""nums = [92,101,3,44,7]ptr = FFI::MemoryPointer.new :long_long, nums.sizeptr.write_array_of_long_long nums…ffi普通人管理从提供人者努读取的小写。节点Sturct普通人用于创始人GoSlice和 GoString给定到它们各自的C内部结构。当列车运行预定义时,它才会初始化基本概念的Go数组,如下标明:
chongchong.Add(12, 99) = 111chongchong.Cosine(1) = 0.5403023058681398chongchong.Sort([12,54,9,423,9] = [ 0, 9, 12, 54, 423 ]Hello Node! Java为在Java里初始化基本概念的Go数组,需要Java Native Access或JNA,,如以下预定义片段标明:
Java适配器Chonghcong从chongchong.so提供人者努明文读取的小写。类GoSlice和 GoString给定到它们各自的C内部结构问到。当预定义转译列车运行时,它初始化基本概念的Go数组,如下标明:
用javac转译该预定义,记得用-cp 过渡到jna的jar包
javac -cp jna.jar Cc.java才会转译失败Cc.class,然后java分派
java -cp .:jna.jar Ccchongchong.Add(12, 99) = 111chongchong.Cosine(1.0) = 0.5403023058681398chongchong.Sort(53,11,5,2,88) = [2 5 11 53 88 ]Hello Java! 正确性本文里 ,我们讲解了如何创始人一个Golang的数组提供人者努,通过将Golang包则有C建筑风格的提供人者努,Go程序员可以用作提供人者普通人浮点数明文集成,然后可以在各种第二语言,包括C、Python、Ruby、Node、Java 等巧妙地用作。
。上海哪医院白癜风好西安白癜风好医院
石家庄医院白癜风哪家医院好
感冒咳嗽吃什么好
【警惕】不发烧不咳嗽却腹泻?新冠“隐形”症状来袭,专家提醒早诊早治!
面瘫药物
风湿
月经量少

-
三月下旬大摇大摆发财,3太岁桃花开工遇贵人,喜事双双降临
三月日和大摇大摆发财,3神兽桃花开工引窦氏,喜事双双世界末日 十二神兽狗 旧称狗的熟人进入三月之前旬,大姐正好有“太白”和“西子”的巧合星进门。因此,颇受吉祥的制约,
- 2025-11-242022年,三月你会恨,四月你会成对,会发财致富三生肖
- 2025-11-247天后,3生肖顺风顺水,一连串暴利,全力以赴准备发大财
- 2025-11-24三个十二生肖都注定要生子和孩子,年纪越大,生活越美好。
- 2025-11-24下周开始,4生肖天上掉钱,地上长农夫,穷人发财不发声
- 2025-11-245生肖天生简单当老板,自己创业赚更多
- 2025-11-243月9号-3月20号,有“财星”入命,特别财运茂盛,大财在握的神兽,注意了!
- 2025-11-248岁男孩长期玩狗,右眼表现为白瞳症,猫咪驱虫真的很重要
- 2025-11-24【养宠小知识】金渐层猫咪感冒什么症状 ,参考以下的几点方式
- 2025-11-24漂亮小奶狗躺路边,再见时杰瑞已经在垃圾堆,杰瑞:谢谢你,没放弃我
- 2025-11-24要是你家狗狗不作为你了,那么肯定会有5大表现!