最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

方式一

  • 直接調(diào)用動態(tài)庫,需要有頭文件;
  • 沒有的話還需要自己再寫一個動態(tài)庫去調(diào)用;
  • 過程比較繁瑣;

方式二

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

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

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

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

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(){
   //  手動加載指定位置的so動態(tài)庫
	void* handle = dlopen("libhardwareInfo2.so", RTLD_LAZY);
	struct Hardware_API_Result (*getSysT)();

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

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

	//static char* cj="404";  不能使用靜態(tài)變量,多個線程調(diào)用,值會覆蓋;測試:多次調(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)時間
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
}
/*
啟動4g,啟動成功返回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é)

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

相關(guān)文章

  • 簡單聊聊Golang中defer預(yù)計算參數(shù)

    簡單聊聊Golang中defer預(yù)計算參數(shù)

    在golang當(dāng)中defer代碼塊會在函數(shù)調(diào)用鏈表中增加一個函數(shù)調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Golang中defer預(yù)計算參數(shù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • RabbitMq如何做到消息的可靠性投遞

    RabbitMq如何做到消息的可靠性投遞

    現(xiàn)在的一些互聯(lián)網(wǎng)項目或者是高并發(fā)的項目中很少有沒有引入消息隊列的。 引入消息隊列可以給這個項目帶來很多的好處,這篇文章主要為大家介紹了RabbitMq如何做到消息的可靠性投遞,有需要的朋友可以借鑒參考下
    2022-12-12
  • golang?實現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg的處理方法

    golang?實現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg的處理方法

    這篇文章主要介紹了golang?實現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg,下面主要介紹Golang 代碼使用方法及Golang PDF轉(zhuǎn)JPEG的詳細(xì)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Golang高效解析和生成XML的示例詳解

    Golang高效解析和生成XML的示例詳解

    這篇文章將從Golang中處理XML的基本概念開始,詳細(xì)介紹如何讀取和解析XML文件,然后轉(zhuǎn)向如何創(chuàng)建和輸出XML數(shù)據(jù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Go語言學(xué)習(xí)之映射(map)的用法詳解

    Go語言學(xué)習(xí)之映射(map)的用法詳解

    Map是一種無序的鍵值對的集合。這篇文章主要為大家詳細(xì)介紹了Go語言中映射的用法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2022-04-04
  • Go方法接收者值接收者與指針接收者詳解

    Go方法接收者值接收者與指針接收者詳解

    這篇文章主要為大家介紹了Go方法接收者值接收者與指針接收者詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Golang 變量申明的三種方式

    Golang 變量申明的三種方式

    這篇文章主要介紹了Golang 變量申明的三種方式,幫助大家更好的理解和學(xué)習(xí)golang,感興趣的朋友可以了解下
    2020-08-08
  • Go中跨語言實現(xiàn)傳輸?shù)姆椒ú襟E

    Go中跨語言實現(xiàn)傳輸?shù)姆椒ú襟E

    gRPC是Google開源的高性能RPC框架,基于HTTP/2協(xié)議和ProtocolBuffers序列化,支持多語言、流式傳輸和企業(yè)級特性,文章詳細(xì)介紹了gRPC的接口定義語言、服務(wù)定義、消息類型、RPC類型以及服務(wù)端和客戶端的實現(xiàn)方式,需要的朋友可以參考下
    2026-04-04
  • Golang基于文件魔數(shù)判斷文件類型的案例代碼

    Golang基于文件魔數(shù)判斷文件類型的案例代碼

    這篇文章主要介紹了Golang基于文件魔數(shù)判斷文件類型,本文介紹了基于文件魔數(shù)判斷文件類型的方法,主要涉及如何ReadSeek讀取文件指定字節(jié)內(nèi)容,然后介紹文件魔數(shù),最后給出示例基于魔數(shù)判斷文件類型,需要的朋友可以參考下
    2023-02-02
  • golang 如何替換掉字符串里面的換行符\n

    golang 如何替換掉字符串里面的換行符\n

    這篇文章主要介紹了golang 替換掉字符串里面的換行符\n操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論

卓资县| 达尔| 海宁市| 邮箱| 长沙县| 高阳县| 盘锦市| 黎川县| 邵阳县| 武城县| 塔河县| 敦煌市| 尖扎县| 巫山县| 河曲县| 集贤县| 旺苍县| 阳泉市| 崇州市| 宁安市| 抚州市| 马山县| 噶尔县| 镇原县| 繁峙县| 左权县| 葵青区| 漳州市| 新田县| 宜兴市| 共和县| 元朗区| 乌海市| 灵武市| 册亨县| 许昌市| 库尔勒市| 阳新县| 凤山市| 从化市| 永吉县|