激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

香港云服务器
服務器之家 - 腳本之家 - Golang - 在Golang中使用C語言代碼實例

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

2019-11-17 19:22Golang教程網 Golang

這篇文章主要介紹了在Golang中使用C語言代碼實例,本文先是給出了一個Hello World例子、Golang 引用 C例子,并總結了一些要注意的地方,需要的朋友可以參考下

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

Hello World

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

復制代碼代碼如下:

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


執(zhí)行程序:

復制代碼代碼如下:

go run main.go


程序執(zhí)行并輸出 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 內存區(qū)域到 Golang 的字節(jié)數組中去
func C.GoBytes(unsafe.Pointer, C.int) []byte

 

其他需要注意的點:

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

延伸 · 閱讀

精彩推薦
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggo日志系統(tǒng)logrus顯示文件和行號的操作

    go日志系統(tǒng)logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優(yōu)雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
405
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 日韩视频一区二区在线观看 | 2019亚洲日韩新视频 | 一级做a爰性色毛片免费 | 高潮娇喘嗯啊~文字 | 在线看一区二区三区 | 欧美色淫 | 亚洲婷婷日日综合婷婷噜噜噜 | 奇米影视在线 | 最近国产中文字幕 | 男女做性免费网站 | 中文字幕一区二区三区四区 | 成人不卡| 在线播放免费播放av片 | 亚洲一区二区免费视频 | 免费观看一区二区三区视频 | 主播粉嫩国产在线精品 | 日韩视频一二三 | 国产一级在线看 | 国产免费黄网 | 国产免费视频一区二区裸体 | 亚洲精品欧美在线 | 牛牛碰在线 | 国产精选电影免费在线观看 | 在线观看一区二区三区四区 | 免费不卡一区 | 骚av在线| 黑人一区| 欧美爱爱视频网站 | 毛片视频网站 | 成人 日韩 | 亚洲乱妇19p | 成人黄色网战 | 国产91九色视频 | 国产porn在线 | 一级视频网站 | 蜜桃传媒视频麻豆第一区免费观看 | 国产一级一国产一级毛片 | 欧美色视 | 农村少妇吞精夜夜爽视频 | 91av在线影院 | av免费av|