亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

在Golang中使用C語言代碼實例

2020-04-01 19:26:07
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了在Golang中使用C語言代碼實例,本文先是給出了一個Hello World例子、Golang 引用 C例子,并總結了一些要注意的地方,需要的朋友可以參考下
 

cgo 使得在 Golang 中可以使用 C 代碼。

Hello World

為了有一個較為直觀的了解,我們來看一個簡單的例子,創建文件 main.go:

復制代碼代碼如下:

package main
 
/*
#include <stdio.h>
 
void sayHi() {
    printf("Hi");
}
*/
import "C"
 
func main() {
    C.sayHi()
}

執行程序:
復制代碼代碼如下:

go run main.go

程序執行并輸出 hi(更多的范例可以見 $GOROOT/misc/cgo)。

 

Windows 下的準備工作

如果想要在 Windows 上使用 cgo,那么需要安裝 gcc 編譯器,這里我使用 mingw-w64。

設置編譯和鏈接標志

我們使用 import “C” 導入的是一個偽包(pseudo-package),我們通過其來使用 C 代碼。在 import “C” 之前,緊跟著 import “C” 的注釋可以包括:

1.編譯器和鏈接器標志
2.C 代碼

我們可以通過 #cgo 指令來設置編譯器和鏈接器標志,例如:

復制代碼代碼如下:

// #cgo CFLAGS: -DPNG_DEBUG=1
// #cgo amd64 386 CFLAGS: -DX86=1
// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"

 

附帶提及一點的是,這些指令中可以包含構建約束(build constraint),詳細內容見:http://golang.org/pkg/go/build/#hdr-Build_Constraints。

常用的 #cgo 指令有:

1.CPPFLAGS、CFLAGS 指令被用于編譯當前包中的 C 文件(任何的 .c、.s、.S 文件)
2.CPPFLAGS、CXXFLAGS 指令被用于編譯當前包中的 C++ 文件(任何的 .cpp、.cc、.cxx 文件)
3.LDFLAGS 指令用于指定鏈接器標志
4.pkg-config 指令用于通過 pkg-config 工具獲取編譯器和鏈接器標志(例如:#cgo pkg-config: png cairo)

Golang 引用 C

結構體上需要注意的點:

1.C 結構體的域名稱如果為 Golang 的關鍵字時,訪問時需要在域名稱前面加上 _。比如說,C 中有一個結構體變量 x,此變量對應的結構體中有一個域 type,那么在 Golang 中需要通過 x._type 來訪問 type 域
2.結構體的位域、非對齊數據等無法在 Golang 中表示時會被忽略
3.Golang 結構體中不能使用 C 類型的域

標準的 C 數值類型對應:

1.C.char
2.C.schar(signed char)
3.C.uchar(unsigned char)
4.C.short
5.C.ushort(unsigned short)
6.C.int
7.C.uint(unsigned int)
8.C.long
9.C.ulong(unsigned long)
10.C.longlong(long long)
11.C.ulonglong(unsigned long long)
12.C.float
13.C.double

任何的 C 函數(包括 void 函數)都可以返回一個返回值和 C 的 errno 變量(作為錯誤):

復制代碼代碼如下:

n, err := C.sqrt(-1)
_, err := C.voidFunc()

 

直接調用 C 函數指針目前還無法支持。

有一些特殊的函數可以用于 C 類型和 Golang 類型之間轉換(通過數據拷貝的方式),偽定義如下:

 

復制代碼代碼如下:

// Golang 的字符串轉為 C 字符串
// C 的字符串是使用 malloc 分配的,因此,此函數的調用者
// 需要調用 C.free 來釋放內存
func C.CString(string) *C.char
 
// 轉換 C 字符串到 Golang 字符串
func C.GoString(*C.char) string
 
// 轉換一定長度的 C 字符串到 Golang 字符串
func C.GoStringN(*C.char, C.int) string
 
// 轉換一塊 C 內存區域到 Golang 的字節數組中去
func C.GoBytes(unsafe.Pointer, C.int) []byte

 

其他需要注意的點:

1.C 語言中的 void* 對應 unsafe.Pointer
2.C 語言中的結構、聯合、枚舉類型(而非變量),在 Golang 中需要加上 struct_、union_、enum_ 前綴訪問。由于 Golang 中沒有聯合這種數據類型,因此 C 的聯合在 Golang 中被表示為字節數組
3.和 C 語言等價的那些類型是不可以導出的


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成aaa人片在线观看蜜臀| 国产精品一区二区av影院萌芽| 国产午夜精品免费一区二区三区| 韩国美女主播一区| 亚洲片在线观看| 欧美日韩在线视频一区二区| 亚洲free性xxxx护士白浆| 亚洲欧美成人一区二区在线电影| 久久综合国产精品台湾中文娱乐网| 成人黄色大片在线免费观看| 日韩亚洲欧美中文在线| 日本久久久久久| 91精品啪aⅴ在线观看国产| 欧美日韩在线一区| 92看片淫黄大片欧美看国产片| 欧美黑人狂野猛交老妇| 黄色一区二区在线观看| 亚洲成人久久电影| 亚洲剧情一区二区| 欧美性在线视频| 亚洲成年网站在线观看| 欧美日本高清视频| 秋霞av国产精品一区| 国产精品视频专区| 日韩免费观看视频| 欧美成人精品一区二区| 久久香蕉精品香蕉| 日韩免费看的电影电视剧大全| 欧美激情在线视频二区| 热re91久久精品国99热蜜臀| 在线观看欧美www| 亚洲永久在线观看| 欧美中文字幕在线视频| 日韩风俗一区 二区| 色播久久人人爽人人爽人人片视av| 正在播放亚洲1区| 成人在线激情视频| 伊人久久久久久久久久| 久久国产精品久久久| 97香蕉超级碰碰久久免费的优势| 搡老女人一区二区三区视频tv| 精品久久国产精品| 综合网日日天干夜夜久久| 国产v综合ⅴ日韩v欧美大片| 在线视频日本亚洲性| 日韩国产欧美区| 中文字幕精品久久久久| 免费99精品国产自在在线| 欧美亚洲日本网站| 久久国产精品视频| 欧美大片在线免费观看| 亚洲高清免费观看高清完整版| 国产欧亚日韩视频| 成人欧美在线观看| 亚洲片在线观看| 国产在线a不卡| 亚洲精品videossex少妇| 日韩中文字幕在线播放| 色天天综合狠狠色| 清纯唯美日韩制服另类| 亚洲欧美国产日韩天堂区| 性欧美在线看片a免费观看| 亚洲一区二区三区四区在线播放| 欧美黑人一级爽快片淫片高清| 欧美肥婆姓交大片| 在线视频欧美日韩| 亚洲乱码国产乱码精品精天堂| 久久综合国产精品台湾中文娱乐网| 精品久久久久久久大神国产| 亚洲国产精品久久久久秋霞不卡| 欧美体内谢she精2性欧美| 亚洲欧美日韩国产成人| 国产欧美在线看| 国产精品久久婷婷六月丁香| 国产综合视频在线观看| 欧美一级视频一区二区| 国产精品成人一区二区三区吃奶| 欧美精品18videosex性欧美| 午夜精品蜜臀一区二区三区免费| 色www亚洲国产张柏芝| 最新的欧美黄色| 成人h片在线播放免费网站| 欧美激情a在线| 亚洲三级 欧美三级| 欧美日韩国产中文精品字幕自在自线| 欧美激情免费观看| 成人黄色av网| 成人有码视频在线播放| 国产经典一区二区| 久久全国免费视频| 日韩av中文字幕在线免费观看| 欧美在线影院在线视频| 精品国产一区二区三区在线观看| 欧美久久精品午夜青青大伊人| 九九热精品视频在线播放| 国产精品久久久久久亚洲影视| 日韩成人黄色av| 久久久国产精品亚洲一区| 亚洲免费视频观看| 成人精品久久一区二区三区| 日本欧美一二三区| 国产精品va在线| 亚洲国产精品国自产拍av秋霞| 亚洲男人天堂视频| 亚洲欧美成人精品| 亚洲小视频在线观看| 久久99精品久久久久久青青91| 亚洲人午夜精品免费| 亚洲欧美日韩国产成人| 久久夜精品va视频免费观看| 欧美激情一区二区三区久久久| 亚洲综合中文字幕在线| 中文日韩在线观看| 欧美成aaa人片在线观看蜜臀| 亚洲国语精品自产拍在线观看| 亚洲精品资源美女情侣酒店| 国产成人亚洲综合青青| 亚洲精品国产电影| 精品久久久久久久中文字幕| 麻豆国产精品va在线观看不卡| 国模极品一区二区三区| 欧美激情免费看| 欧美色道久久88综合亚洲精品| 91精品国产91久久久久久不卡| 亚洲精品国产综合区久久久久久久| 欧美日韩精品中文字幕| 亚洲自拍偷拍区| 日韩电视剧免费观看网站| 国产成人精品在线| 国产视频精品一区二区三区| 欧美精品videosex极品1| 国产97在线视频| 成人午夜在线影院| 国产欧美日韩精品丝袜高跟鞋| 欧美成人全部免费| 欧美成人激情视频免费观看| 国产欧美va欧美va香蕉在| 色婷婷久久av| 久久久久久久国产精品视频| 成人激情在线观看| 日韩视频免费大全中文字幕| 亚洲国产精品成人av| 琪琪第一精品导航| 日本电影亚洲天堂| 亚洲美女视频网站| 亚洲自拍偷拍网址| 欧美亚洲视频在线观看| 中文字幕在线视频日韩| 国产原创欧美精品| 国产欧美中文字幕| 国产视频观看一区| 亚洲国产精品va在线看黑人动漫| 欧美日韩高清区| 久久亚洲综合国产精品99麻豆精品福利| 韩国精品久久久999| 国产精品69av| 国产精品三级美女白浆呻吟| 精品福利视频导航| 九九久久久久久久久激情| 国产精品一香蕉国产线看观看| 亚洲激情小视频| 久久久精品视频成人| 欧美丝袜第一区| 亚洲日本成人女熟在线观看|