欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go如何調(diào)用C動(dòng)態(tài)庫(kù)函數(shù)

 更新時(shí)間:2025年05月23日 08:39:06   作者:碼靈  
這篇文章主要介紹了go如何調(diào)用C動(dòng)態(tài)庫(kù)函數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

go調(diào)用C動(dòng)態(tài)庫(kù)函數(shù)

方式一

  • 直接調(diào)用動(dòng)態(tài)庫(kù),需要有頭文件;
  • 沒(méi)有的話還需要自己再寫(xiě)一個(gè)動(dòng)態(tài)庫(kù)去調(diào)用;
  • 過(guò)程比較繁瑣;

方式二

  • 直接使用cgo調(diào)用;
  • 使用dlopen去調(diào)用動(dòng)態(tài)庫(kù);
  • 比較方便和go代碼在一個(gè)文件上;

1 字符串、int相互轉(zhuǎn)換;

2內(nèi)存手動(dòng)釋放;

!!! go 調(diào)用C動(dòng)態(tài)庫(kù)不支持交叉編譯!

package main


/*
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#cgo LDFLAGS: -ldl

struct Hardware_API_Result {
   int  result;
   char json[256];
};


char* getSysTime(){
   //  手動(dòng)加載指定位置的so動(dòng)態(tài)庫(kù)
	void* handle = dlopen("libhardwareInfo2.so", RTLD_LAZY);
	struct Hardware_API_Result (*getSysT)();

	//根據(jù)動(dòng)態(tài)鏈接庫(kù)操作句柄與符號(hào),返回符號(hào)對(duì)應(yīng)的地址
	getSysT = dlsym(handle, "get_system_time");

	//struct MidStruct midres;
	struct Hardware_API_Result r;
	r = getSysT();

	//static char* cj="404";  不能使用靜態(tài)變量,多個(gè)線程調(diào)用,值會(huì)覆蓋;測(cè)試:多次調(diào)用go中日志輸出成亂碼
	char * cj;
	cj = (char *)malloc(256);
	strcpy(cj,"404");
	//
	if(r.result==0){
	   strcpy(cj,r.json);
	}
	dlclose(handle);
	return cj;
}
int start4G(){
	void* handle = dlopen("libhardwareInfo2.so", RTLD_LAZY);
	int (*start4G)();
	start4G = dlsym(handle, "start_4g");
	int rv=start4G();
	dlclose(handle);
	return rv;
}

int ping(char* cip){
    void* handle = dlopen("libhardwareInfo2.so", RTLD_LAZY);
	struct Hardware_API_Result (*midFuncName)( char* );
    midFuncName = dlsym(handle, "ping");
	struct Hardware_API_Result midres;
    midres=midFuncName(cip);
	int rvi=midres.result;
    dlclose(handle);

    return rvi;
}


*/
import "C"
import (
	"fmt"
	"unsafe"
)


/*
獲取系統(tǒng)時(shí)間
json 格式:{"local_time":2020-03-23  03:02:46.795268}
*/
func getSystime() string {
    //c中指針
	sip:=C.getSysTime()
	//轉(zhuǎn)變?yōu)間o字符串
	si:=C.GoString(sip)
	//釋放c中指針
	C.free(unsafe.Pointer(sip))
	return  si
}
/*
啟動(dòng)4g,啟動(dòng)成功返回0
*/
func start4G() int{
	//c類型
	mrv:=C.start4G()
	//轉(zhuǎn)換成go int類型
	rv:=int(mrv)
	return rv
}


/**
判斷某ip可否ping通,值為0表示通
*/
func ping(ip string)int{
	cip := C.CString(ip)
	mrv:=C.ping(cip)
	rv:=int(mrv)
	C.free(unsafe.Pointer(cip))
	return rv
}

參考方法1

C.char  
C.schar (signed char)  
C.uchar (unsigned char)  
C.short  
C.ushort (unsigned short)  
C.int  
C.uint (unsigned int)  
C.long  
C.ulong (unsigned long)  
C.longlong (long long)  
C.ulonglong (unsigned long long)  
C.float  
C.double.   
  
  
unsafe.Pointer (void*)  
  
// Go string to C string  
func C.CString(string) *C.char  
  
var val []byte  
(*C.char)(unsafe.Pointer(&val[0]))

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Golang AGScheduler動(dòng)態(tài)持久化任務(wù)調(diào)度的強(qiáng)大庫(kù)使用實(shí)例

    Golang AGScheduler動(dòng)態(tài)持久化任務(wù)調(diào)度的強(qiáng)大庫(kù)使用實(shí)例

    這篇文章主要為大家介紹了Golang AGScheduler動(dòng)態(tài)持久化任務(wù)調(diào)度的強(qiáng)大庫(kù)使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go歸并排序算法的實(shí)現(xiàn)方法

    Go歸并排序算法的實(shí)現(xiàn)方法

    歸并排序采用的也是分治的策略,把原本的問(wèn)題先分解成一些小問(wèn)題進(jìn)行求解,再把這些小問(wèn)題各自的答案修整到一起得到原本問(wèn)題的答案,從而達(dá)到分而治之的目的,對(duì)Go歸并排序算法相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-04-04
  • go語(yǔ)言中的interface使用實(shí)例

    go語(yǔ)言中的interface使用實(shí)例

    這篇文章主要介紹了go語(yǔ)言中的interface使用實(shí)例,go語(yǔ)言中的interface是一組未實(shí)現(xiàn)的方法的集合,如果某個(gè)對(duì)象實(shí)現(xiàn)了接口中的所有方法,那么此對(duì)象就實(shí)現(xiàn)了此接口,需要的朋友可以參考下
    2015-05-05
  • Go??import _ 下劃線使用

    Go??import _ 下劃線使用

    這篇文章主要為大家介紹了Go??import下劃線_使用小技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • go連接kafka的實(shí)現(xiàn)示例

    go連接kafka的實(shí)現(xiàn)示例

    本文主要介紹了go連接kafka的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang 項(xiàng)目打包部署環(huán)境變量設(shè)置方法

    golang 項(xiàng)目打包部署環(huán)境變量設(shè)置方法

    最近將 golang 項(xiàng)目打包部署在不同環(huán)境,下面分享一下我的心得體會(huì),對(duì)golang 項(xiàng)目打包部署環(huán)境變量設(shè)置方法感興趣的朋友一起看看吧
    2024-07-07
  • golang的Pseudo-versions使用問(wèn)題解析

    golang的Pseudo-versions使用問(wèn)題解析

    這篇文章主要為大家介紹有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪了golang的Pseudo-versions使用問(wèn)題解析,
    2023-07-07
  • golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)

    golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)

    本文主要介紹了golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 試了下Golang實(shí)現(xiàn)try catch的方法

    試了下Golang實(shí)現(xiàn)try catch的方法

    雖然在使用Golang的時(shí)候發(fā)現(xiàn)沒(méi)有try catch這種錯(cuò)誤處理機(jī)制但是想一想golang作為一門(mén)優(yōu)雅的語(yǔ)言,似乎也是情理之中。那么夠怎么捕獲異常呢,本文就來(lái)介紹一下
    2021-07-07
  • golang如何獲得一個(gè)變量的類型

    golang如何獲得一個(gè)變量的類型

    這篇文章主要介紹了golang獲得一個(gè)變量類型的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論