分享
  1. 首页
  2. 文章

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

_小老虎_ · · 1670 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


类型

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

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:_小老虎_

查看原文:[Golang-C]go和c的基本类型转换

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1670 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏