Go

[Golang-C]go和c的基本类型转换

2020-10-29  本文已影响0人  _小老虎_

类型

char -->  C.char -->  byte
signed char -->  C.schar -->  int8
unsigned char -->  C.uchar -->  uint8
short int -->  C.short -->  int16
short unsigned int -->  C.ushort -->  uint16
int -->  C.int -->  int
unsigned int -->  C.uint -->  uint32
long int -->  C.long -->  int32 or int64
long unsigned int -->  C.ulong -->  uint32 or uint64
long long int -->  C.longlong -->  int64
long long unsigned int -->  C.ulonglong -->  uint64
float -->  C.float -->  float32
double -->  C.double -->  float64
wchar_t -->  C.wchar_t  -->  
void * -> unsafe.Pointer

转换

package main

/*
#include <stdio.h>
#include <stdlib.h>

char ch = 'M';
unsigned char uch = 253;
short st = 233;
int i = 257;
long lt = 11112222;
float f = 3.14;
double db = 3.15;
void * p;
char *str = "const string";
char str1[64] = "char array";

void printI(void *i)
{
    printf("print i = %d\n", (*(int *)i));
}

struct ImgInfo {
    char *imgPath;
    int format;
    unsigned int width;
    unsigned int height;
};

void printStruct(struct ImgInfo *imgInfo)
{
    if(!imgInfo) {
        fprintf(stderr, "imgInfo is null\n");
        return ;
    }

    fprintf(stdout, "imgPath = %s\n", imgInfo->imgPath);
    fprintf(stdout, "format = %d\n", imgInfo->format);
    fprintf(stdout, "width = %d\n", imgInfo->width);
}

*/
import "C"

import (
    "fmt"
    "reflect"
    "unsafe"
)

func main() {
    fmt.Println("----------------Go to C---------------")
    fmt.Println(C.char('Y'))
    fmt.Printf("%c\n", C.char('Y'))
    fmt.Println(C.uchar('C'))
    fmt.Println(C.short(254))
    fmt.Println(C.long(11112222))
    var goi int = 2
    // unsafe.Pointer --> void *
    cpi := unsafe.Pointer(&goi)
    C.printI(cpi)
    fmt.Println("----------------C to Go---------------")
    fmt.Println(C.ch)
    fmt.Println(C.uch)
    fmt.Println(C.st)
    fmt.Println(C.i)
    fmt.Println(C.lt)
    f := float32(C.f)
    fmt.Println(reflect.TypeOf(f))
    fmt.Println(C.f)
    db := float64(C.db)
    fmt.Println(reflect.TypeOf(db))
    fmt.Println(C.db)
    // 区别常量字符串和char数组,转换成Go类型不一样
    str := C.GoString(C.str)
    fmt.Println(str)

    fmt.Println(reflect.TypeOf(C.str1))
    var charray []byte
    for i := range C.str1 {
        if C.str1[i] != 0 {
            charray = append(charray, byte(C.str1[i]))
        }
    }

    fmt.Println(charray)
    fmt.Println(string(charray))

    for i := 0; i < 10; i++ {
        imgInfo := C.struct_ImgInfo{imgPath: C.CString("../images/xx.jpg"), format: 0, width: 500, height: 400}
        defer C.free(unsafe.Pointer(imgInfo.imgPath))
        C.printStruct(&imgInfo)
    }

    fmt.Println("----------------C Print----------------")
}

输出结果

----------------Go to C---------------
89
Y
67
254
11112222
----------------C to Go---------------
77
253
233
257
11112222
float32
3.14
float64
3.15
const string
[64]main._Ctype_char
[99 104 97 114 32 97 114 114 97 121]
char array
----------------C Print----------------
print i = 2
imgPath = ../images/xx.jpg
format = 0
width = 500
imgPath = ../images/xx.jpg
format = 0
width = 500
imgPath = ../images/xx.jpg
format = 0
width = 500
imgPath = ../images/xx.jpg
format = 0
width = 500
上一篇下一篇

猜你喜欢

热点阅读