婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 在Golang中使用C語(yǔ)言代碼實(shí)例

在Golang中使用C語(yǔ)言代碼實(shí)例

熱門(mén)標(biāo)簽:外呼系統(tǒng)多少錢(qián)一年 旅游廁所如何電子地圖標(biāo)注 海外照相館地圖標(biāo)注入駐 滁州自建外呼系統(tǒng) 客服級(jí)電銷(xiāo)機(jī)器人 外呼系統(tǒng)如何接收服務(wù)密碼 智能營(yíng)銷(xiāo)軟件 工商信用卡外呼系統(tǒng)教程 經(jīng)常接到推銷(xiāo)電話機(jī)器人的電話

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

Hello World

為了有一個(gè)較為直觀的了解,我們來(lái)看一個(gè)簡(jiǎn)單的例子,創(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(更多的范例可以見(jiàn) $GOROOT/misc/cgo)。

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

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

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

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

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

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

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

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

附帶提及一點(diǎn)的是,這些指令中可以包含構(gòu)建約束(build constraint),詳細(xì)內(nèi)容見(jiàn):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 指令用于通過(guò) pkg-config 工具獲取編譯器和鏈接器標(biāo)志(例如:#cgo pkg-config: png cairo)

Golang 引用 C

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

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

標(biāo)準(zhǔn)的 C 數(shù)值類(lèi)型對(duì)應(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ù))都可以返回一個(gè)返回值和 C 的 errno 變量(作為錯(cuò)誤):

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

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

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

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

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

// Golang 的字符串轉(zhuǎn)為 C 字符串
// C 的字符串是使用 malloc 分配的,因此,此函數(shù)的調(diào)用者
// 需要調(diào)用 C.free 來(lái)釋放內(nèi)存
func C.CString(string) *C.char
 
// 轉(zhuǎn)換 C 字符串到 Golang 字符串
func C.GoString(*C.char) string
 
// 轉(zhuǎn)換一定長(zhǎng)度的 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

其他需要注意的點(diǎn):

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

您可能感興趣的文章:
  • C語(yǔ)言和go語(yǔ)言之間的交互操作方法
  • Go語(yǔ)言中嵌入C語(yǔ)言的方法
  • Go語(yǔ)言中CGO的使用實(shí)踐

標(biāo)簽:九江 深圳 運(yùn)城 喀什 湘潭 楚雄 晉城 本溪

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在Golang中使用C語(yǔ)言代碼實(shí)例》,本文關(guān)鍵詞  在,Golang,中,使用,語(yǔ)言,代碼,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《在Golang中使用C語(yǔ)言代碼實(shí)例》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于在Golang中使用C語(yǔ)言代碼實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 沙田区| 凌海市| 泰州市| 登封市| 宁远县| 嘉定区| 济源市| 和平区| 梁山县| 齐河县| 东丰县| 霍山县| 肥东县| 临安市| 南宁市| 和静县| 龙岩市| 广水市| 霍城县| 佛坪县| 宁津县| 洪湖市| 茌平县| 饶河县| 类乌齐县| 乐至县| 凭祥市| 嘉黎县| 拜城县| 商水县| 临湘市| 庆元县| 将乐县| 勃利县| 水城县| 无为县| 益阳市| 紫金县| 邵武市| 同江市| 云安县|