美文网首页
19-Go语言和C语言交叉访问

19-Go语言和C语言交叉访问

作者: 喝酸奶要舔盖__ | 来源:发表于2018-10-01 16:18 被阅读0次

Go语言访问C语言

书写C语言代码
  • C语言的代码都需要利用单行注册或者多行注释注释起来
  • 在C语言代码紧随其后的位置写上import "C",就可以在go代码中通过C.函数名称 方式来访问C语言的函数
  • 注意点:
    • C语言代码的注释和import "C"之间不写能任何其他的内容
    • C语言的代码可以利用多行注释注释起来, 也可以利用单行注释注释起来
package main
/*
#include <stdio.h>

void say(){
    printf("我是C语言程序\n");
}
*/
import "C"

func main() {
     C.say()
}
访问C语言数据
  • 注意点:数据类型不同不能直接赋值,需要显示转换
package main

/*
#include <stdio.h>
char ch  = 'b';
int num = 10;
double value = 3.14;

*/
import "C"
import "fmt"

func main() {
    //访问C语言中的数据
    fmt.Println(C.ch)
    fmt.Println(C.num)
    fmt.Println(C.value)

    fmt.Printf("%T\n", C.ch) //main._Ctype_char
    fmt.Printf("%T\n", C.num)  //main._Ctype_int
    fmt.Printf("%T\n", C.value) //main._Ctype_double

    //是否可以直接赋值给Go语言中的变量
    var ch byte
    //数据类型不同不能直接赋值,需要显示转换
    ch = byte(C.ch)
    fmt.Println(ch)

    var num int
    num = int(C.num)
    fmt.Println(num)

    var value float32
    value = float32(C.value)
    fmt.Println(value)
}

访问C语言字符串
  • 将C语言字符串转换为Go语言字符串:C.GoString
  • 将Go语言字符串转换为C语言字符串:C.GoString(应用不多)
package main
/*
#include <stdio.h>
include <stdlin.h>
char *str1 = "www.it666.com";
char str2[20] = "www.it666.com";


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

func main() {
    //利用函数C.GoString将C语言字符串转换为Go语言字符串
    str1 := C.GoString(C.str1)
    var str2 string
    //可以赋值给字符串类型的变量
    str2  = str1
    fmt.Println(str1)
    fmt.Println(str2)

    //注意点: 不能将数组类型直接通过GoString方法转换为Go语言的字符串
    //str3 := C.GoString(C.str2)

    //需要使用这种固定格式才能转换
    str3 := C.GoString(&C.str2[0])
    fmt.Println(str3)

    //了解内容
    // 注意点: 如果将一个Go语言的字符串转换为C语言的字符串之后, 这个字符串是不受Go语言的GC控制的
    // GC 垃圾回收器
    str4 := "www.666"
    str := C.CString(str4)
    fmt.Printf("%s\n", str)
    //手动释放C语言的字符串
    C.free(unsafe.Pointer(str))
}

访问C语言中指针类型
  • 注意点:void *类型, 必须使用Go语言中的unsafe.Pointer来保存
package main
/*
#include <stdio.h>
int num = 66;
int *p1 = &num;
void *p2 = &num;
*/
import "C"
import (
    "fmt"
    "unsafe"
)

func main() {
    //访问C语言中指针类型变量
    //定义变量
    var p *C.int = C.p1
    fmt.Println(*p)

    //注意点: 其它类型都可以按照上面的格式来表示
    //但是void *类型, 必须使用Go语言中的unsafe.Pointer来保存
    var p2 unsafe.Pointer = C.p2
    fmt.Println(p2)
}
访问C语言中的枚举
package main
/*
#include <stdio.h>
enum Gender{
    GenderMale,
    GenderFemale,
    GenderYao
};
*/
import "C"
import "fmt"

func main() {
    // Go语言访问C语言中的枚举和访问普通变量一样, 通过C.枚举值 方式即可
    // C语言中的枚举类型, 在Go语言中对应的是 enum_枚举类型名称
    var gender C.enum_Gender = C.GenderFemale
    fmt.Println(gender)
}

访问结构体类型
package main
/*
#include <stdio.h>
struct Point {
    float x;
    float y;
};
*/
import "C"
import "fmt"

func main() {
    // 注意点: 如果结构体属性是复杂类型, 可能会有问题
    var pi C.struct_Point = C.struct_Point{1.1,2.2}
    fmt.Println(pi.x)
    fmt.Println(pi.y)
}

访问数组类型
package main
/*
#include <stdio.h>
int arr[3] = {1,3,5};
*/
import "C"
import "fmt"

func main() {
    //访问C代码的数组
    //arr := C.arr
    var arr [3]C.int = C.arr
    fmt.Println(arr)
    fmt.Println(arr[0])
    fmt.Println(arr[1])
    fmt.Println(arr[2])
}

相关文章

  • 19-Go语言和C语言交叉访问

    Go语言访问C语言 书写C语言代码 C语言的代码都需要利用单行注册或者多行注释注释起来 在C语言代码紧随其后的位置...

  • Go语言和C语言的交叉访问

    Go语言中导入C语言 方法 Go语言中导入C语言都需要单行注释和多行注释注释起来 在C语言紧随其后的位置编写" i...

  • 18-Go语言和C语言交叉访问

    Go语言中调用C语言函数 在Go语言开篇中我们已经知道, Go语言与C语言之间有着千丝万缕的关系, 甚至被称之为2...

  • Go语言C语言交叉访问

    Go语言访问C语言访问方式 1.C语言的代码都需要利用单行注册或者多行注释注释起来2.在C语言代码紧随其后的位置写...

  • Day02学习总结-认识python、python基础语法、变量

    认识Python Python语言和其他高级语言不同,例如:C语言和Java语言。Python语言不是编译语言,而...

  • 这才是你需要的C/C++Linux服务器开发学习路线!

    前言 C语言和C++属于“造轮子”语言,几乎什么都能做。不过一般来说,C语言和C++主要还是做后台(服务端)开发比...

  • 编译与反编译

    编程语言分为低级语言和高级语言)。其中机器语言和汇编语言属于低级语言,直接用计算机指令编写程序,而C、C++、Ja...

  • iOS学习路线-可参考

    课程分 类 课程模块 模块介绍 课程内容 Part1 C语言C语言和Objective-C语言 C语言 Mac系统...

  • ReactNative/Weex简析

    本质上语言和语言的互相调用需要一些条件:  同属一个体系的语言(比如机器语言,或底层为c语言),这样可以通过底层语...

  • 对程序健壮性的简单理解

    强类型语言VS弱类型语言 在谈健壮性之前,先谈谈什么是强类型语言和弱类型语言。首先,在大学接触的第一门语言就是C语...

网友评论

      本文标题:19-Go语言和C语言交叉访问

      本文链接:https://www.haomeiwen.com/subject/ugenoftx.html