最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年10月27日 09:22:57   投稿:junjie  
這篇文章主要介紹了在Golang中使用C語言代碼實例,本文先是給出了一個Hello World例子、Golang 引用 C例子,并總結(jié)了一些要注意的地方,需要的朋友可以參考下

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

Hello World

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

復(fù)制代碼 代碼如下:

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

執(zhí)行程序:
復(fù)制代碼 代碼如下:

go run main.go

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

Windows 下的準(zhǔn)備工作

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

設(shè)置編譯和鏈接標(biāo)志

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

1.編譯器和鏈接器標(biāo)志
2.C 代碼

我們可以通過 #cgo 指令來設(shè)置編譯器和鏈接器標(biāo)志,例如:

復(fù)制代碼 代碼如下:

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

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

常用的 #cgo 指令有:

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

Golang 引用 C

結(jié)構(gòu)體上需要注意的點:

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

標(biāo)準(zhǔn)的 C 數(shù)值類型對應(yīng):

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 函數(shù)(包括 void 函數(shù))都可以返回一個返回值和 C 的 errno 變量(作為錯誤):

復(fù)制代碼 代碼如下:

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

直接調(diào)用 C 函數(shù)指針目前還無法支持。

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

復(fù)制代碼 代碼如下:

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

其他需要注意的點:

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

相關(guān)文章

  • golang連接池檢查連接失敗時如何重試(示例代碼)

    golang連接池檢查連接失敗時如何重試(示例代碼)

    在Go中,可以通過使用database/sql包的DB類型的Ping方法來檢查數(shù)據(jù)庫連接的可用性,本文通過示例代碼,演示了如何在連接檢查失敗時進行重試,感興趣的朋友一起看看吧
    2023-10-10
  • 淺析Go語言中數(shù)組的這些細節(jié)

    淺析Go語言中數(shù)組的這些細節(jié)

    這篇文章主要為大家詳細介紹了Go語言中數(shù)組一些細節(jié)的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定的幫助,需要的可以了解一下
    2022-11-11
  • Go?tablewriter庫提升命令行輸出專業(yè)度實例詳解

    Go?tablewriter庫提升命令行輸出專業(yè)度實例詳解

    命令行工具大家都用過,如果是運維人員可能會編寫命令行工具來完成各種任務(wù),命令行輸出的美觀和易讀性往往容易被忽視,很爛的輸出會讓人感覺不專業(yè),本文將介紹Go語言中牛逼的實戰(zhàn)工具tablewriter庫,使你在命令行輸出中展現(xiàn)出專業(yè)的一面
    2023-11-11
  • 一文帶你熟悉Go語言中的分支結(jié)構(gòu)

    一文帶你熟悉Go語言中的分支結(jié)構(gòu)

    這篇文章主要和大家分享一下Go語言中的分支結(jié)構(gòu)(if?-?else-if?-?else、switch),文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2022-11-11
  • 在Go中構(gòu)建并發(fā)TCP服務(wù)器

    在Go中構(gòu)建并發(fā)TCP服務(wù)器

    今天小編就為大家分享一篇關(guān)于在Go中構(gòu)建并發(fā)TCP服務(wù)器的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 使用Golang的gomail庫實現(xiàn)郵件發(fā)送功能

    使用Golang的gomail庫實現(xiàn)郵件發(fā)送功能

    本篇博客詳細介紹了如何使用Golang語言中的gomail庫來實現(xiàn)郵件發(fā)送的功能,首先,需要準(zhǔn)備工作,包括安裝Golang環(huán)境、gomail庫,以及申請126郵箱的SMTP服務(wù)和獲取授權(quán)碼,其次,介紹了在config文件中配置SMTP服務(wù)器信息的步驟
    2024-10-10
  • golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解

    golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解

    這篇文章主要給大家介紹了關(guān)于golang利用unsafe操作未導(dǎo)出變量-Pointer使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Go+Redis緩存設(shè)計與優(yōu)化實現(xiàn)

    Go+Redis緩存設(shè)計與優(yōu)化實現(xiàn)

    本文主要介紹了Go+Redis緩存設(shè)計與優(yōu)化實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Go語言反射獲取類型屬性和方法示例

    Go語言反射獲取類型屬性和方法示例

    這篇文章主要為大家介紹了本文將介紹?Go?反射?reflect.StructField?和?reflect.Method?相關(guān)的內(nèi)容,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 詳解Golang time包中的time.Duration類型

    詳解Golang time包中的time.Duration類型

    在日常開發(fā)過程中,會頻繁遇到對時間進行操作的場景,使用 Golang 中的 time 包可以很方便地實現(xiàn)對時間的相關(guān)操作,本文講解一下 time 包中的 time.Duration 類型,需要的朋友可以參考下
    2023-07-07

最新評論

铜山县| 龙门县| 武鸣县| 新乡市| 平塘县| 广南县| 浦北县| 洱源县| 子洲县| 荥经县| 京山县| 海阳市| 扎鲁特旗| 大姚县| 桐梓县| 泸水县| 玛多县| 巴里| 海阳市| 瓦房店市| 杭州市| 汉川市| 全椒县| 襄城县| 岱山县| 江都市| 科技| 大竹县| 巴南区| 扬中市| 神木县| 龙岩市| 体育| 天峨县| 清原| 横山县| 富裕县| 乌苏市| 北海市| 阜平县| 宝鸡市|