国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

快速上手 Go CGO,掌握在 Go 里寫 C!

開發 前端
在今天這篇文章中,我們介紹了 Go 語言中 CGO 的基礎知識和快速入門。整體上,只要適應了寫法,CGO 的用法就不算太麻煩。

大家好,我是煎魚。

最近因為各種奇怪的原因,接觸到了 Go 特色之一 CGO。這方面的相關內容也相對少一些,給大家拋磚引玉。

圖片

圖片來源于 marlin

畢竟很多跨語言調用,還是會依賴 CGO 這個特性。希望大家在真正要用時有個前置知識墊肚子。

CGO 是什么

CGO 就是 C 和 Go,兩個編程語言。指的是能夠創建調用 C 代碼的 Go 包。對照著 Go 代碼中的 “C”:

package main

import "C"

func main() {}

一旦程序中出現 import "C",則意味著開啟 CGO 特性。在進行 go build 等階段時,將會調用 C 編譯器(通常是 gcc 或 clang)。

CGO 對應的環境變量是 CGO_ENABLED,設置為 1 則開啟 CGO,為 0 則關閉 CGO。

編譯命令如下:

CGO_ENABLED=0 go build -o hellojy main.go

當然,對于默認值。該環境變量值為 1,C 編譯器也是使用 gcc。我們可以通過 go env 看到:

圖片

一旦關閉就會影響 CGO 編譯。需要特別留意,交叉編譯時會默認關閉 CGO。

CGO 快速上手

最小 Demo

先來一個 CGO 的 Go 例子:

package main

//#include <stdio.h>
import "C"

func main() {
 s := C.CString("hello world.")
 C.puts(s)
}

運行 go run main.go,輸出結果:

hello world.

聲明 C 注解

如果你沒有了解過 CGO,看到上面的例子,可能會有好幾個疑問。

首先是 include:

//#include <stdio.h>
import "C"

import "C" 我們懂,是導入 C 的偽包。前面的注解是什么?

無論是:

//#include <stdio.h>

又或是:

/*
#include <stdio.h>
#include <stdlib.h>
*/

實際上這是導入 C 前的注解,注解內容可以包含任何 C 代碼,例如:函數、變量的聲明定義、庫引用等。(該注解要緊挨導入語句)

回到 Demo 本身,如果我們去掉 //#include <stdio.h>,再運行會出現如下報錯:

# command-line-arguments
./main.go:7:2: could not determine kind of name for C.puts

去掉后,語句 C.puts(s) 將無法運行。

實際上 stdio.h 的全稱是:standard input output.header(標準輸入輸出頭文件)。該文件大都是些輸入輸出函數的聲明,引用了這庫,就能使用 C 的 puts 方法。

其他同理,你在注解中聲明、定義的東西,均可以在 Go 代碼中通過 C 這個偽包來引用和調用。

其次像是 CString 方法,屬于在 Go 和 C 類型之間需要復制數據的特殊函數,偽包 C 有進行預定義。

例如:

func C.CString(string) *C.char
func C.CBytes([]byte) unsafe.Pointer
func C.GoString(*C.char) string
func C.GoStringN(*C.char, C.int) string
func C.GoBytes(unsafe.Pointer, C.int) []byte

Go 和 C 類型對照

Go 官方有提供一份基礎類型的對照表,大家可以參照來使用和理解。

如下:

C 語言類型

CGO 類型

Go語言類型

char

C.char

byte

singed char

C.schar

int8

unsigned char

C.uchar

uint8

short

C.short

int16

unsigned short

C.ushort

uint16

int

C.int

int32

unsigned int

C.uint

uint32

long

C.long

int32

unsigned long

C.ulong

uint32

long long int

C.longlong

int64

unsigned long long int

C.ulonglong

uint64

float

C.float

float32

double

C.double

float64

size_t

C.size_t

uint

注意事項

使用 CGO,除了會帶來一定的性能損耗外。需要特別注意的是:內存泄露。因為 Go 是帶垃圾回收機制的編程語言,而使用了 C 后,需要手動的管理內存。

還是這個 Demo:

package main

//#include <stdio.h>
import "C"

func main() {
 s := C.CString("hello world.")
 C.puts(s)
}

如果這是一個常駐進程,也沒有任何釋放動作。用 C.CString 方法所申請的變量 s 就會泄露。

因此與 “C” 相關的變量創建,需要進行手動的內存管理。正確的代碼如下:

/*
#include <stdio.h>
#include <stdlib.h>
*/
import "C"
import (
 "unsafe"
)

func main() {
 b := C.CString("hello world.")
 C.puts(b)
 C.free(unsafe.Pointer(b))
}

需要調用 C.free 方法進行主動的內存釋放。如果該程序自然結束,也會自動回收。

總結

在今天這篇文章中,我們介紹了 Go 語言中 CGO 的基礎知識和快速入門。整體上,只要適應了寫法,CGO 的用法就不算太麻煩。

需要特別注意手動內存管理、性能損耗等多方面的制約。后續我們也會繼續深入 CGO 方面的內容。

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2022-08-23 08:53:31

Go項目語言

2023-09-26 01:21:34

2021-02-02 09:10:12

Go語言二進制

2021-02-05 18:22:51

GoC剖析

2022-12-01 08:15:41

CGOswitcherror

2022-12-07 09:00:18

錯誤異常CGO

2021-09-29 18:17:30

Go泛型語言

2023-03-27 09:40:01

GoWebAssembl集成

2022-03-25 21:57:49

匯編Go語言

2025-11-11 01:45:55

Go代碼goroutine

2024-10-30 09:50:51

WebGo語言

2021-11-10 15:37:49

Go源碼指令

2025-02-10 08:49:40

2021-03-10 08:55:42

Go數據語言

2023-03-29 08:18:16

Go調試工具

2023-05-08 07:55:05

快速排序Go 語言

2025-07-28 06:32:12

Gogo func()

2023-12-01 08:01:33

GoValidator

2020-03-02 10:30:45

阿里互聯網技術

2020-03-02 15:27:28

阿里新人項目
點贊
收藏

51CTO技術棧公眾號

快播亚洲色图| 在线视频不卡国产| 国产亚洲一区二区手机在线观看| 亚洲精品一二三四区| bt天堂新版中文在线地址| 在线播放一区| 亚洲最大福利视频网| 亚洲制服一区| 久久久久久久一区二区| 亚洲影视资源| 俺也去精品视频在线观看| 国产精品电影| 亚洲精品国精品久久99热| 国产一区二区三区福利| 欧美日韩免费看| 久草在线资源视频在线观看| 亚洲桃色在线一区| 午夜免费啪视频观看视频| 亚洲精品国产a久久久久久| 熟女人妇 成熟妇女系列视频| 国产精品一区专区| 国产av第一区| 高清久久久久久| 国产av国片精品| 久久久久99精品一区| 成人免费在线观看视频网站| 国产欧美精品一区aⅴ影院| 日本 片 成人 在线| 国产精品国产自产拍高清av王其| 538任你躁在线精品免费| 国产精品久久久久影视| 国产乱妇乱子| 亚洲成人tv网| wwwww在线观看免费视频| 欧美日韩一二三| 激情网站在线| 国产一区二区三区视频 | 秋霞成人午夜伦在线观看| 欧美日韩国产精品一卡| 国产真实精品久久二三区| av免费看网址| 中文字幕亚洲成人| 精品无人乱码| 亚洲国产精品大全| 高清不卡一区| 国产精品自拍视频| 日日骚欧美日韩| 日本一本中文字幕| 亚洲综合区在线| 日本在线视频www鲁啊鲁| 色妞色视频一区二区三区四区| 国产无遮挡裸体免费久久| 成人在线观看视频网站| 一区视频在线看| 欧美乱大交xxxxx潮喷l头像| 成人免费在线观看入口| 国产视频网址在线| 在线精品高清中文字幕| 狠狠做六月爱婷婷综合aⅴ| 精品国产乱码久久久久久久软件| 国产真实乱偷精品视频免| 亚洲综合色在线观看| 色av综合在线| 成人免费看黄| 国产精品久久久久久久久久99| 亚洲综合精品四区| 91淫黄看大片| 欧美精品tushy高清| 久久爱www.| 久久久久久a亚洲欧洲aⅴ| 91麻豆精东视频| 一级毛片视频在线观看| 精品国产一区二区三区久久狼黑人| 偷拍一区二区| 黄色a级在线观看| 亚洲国产aⅴ天堂久久| 成人影院网站| 成人免费在线视频网站| 国产精品影视在线观看| 涩涩视频在线观看免费| 综合久久五月天| 在线成人直播| 亚洲一二三区av| 91精品国产手机| 亚洲免费一区三区| 日韩在线第一区| 一区二区三区**美女毛片| 亚洲电影观看| 国产精品永久入口久久久| 久久久久国产精品人| 黑人精品视频| 91福利入口| 亚洲视频香蕉人妖| 欧美日韩视频免费观看| 加勒比在线一区二区三区观看| 国产精品二三区| 成人国产精选| 宅男在线精品国产免费观看| 日韩人在线观看| 狼人天天伊人久久| 欧美a级免费视频| 日韩美女视频在线| 综合一区在线| 超碰在线电影| 97国产精品视频人人做人人爱| 丰满亚洲少妇av| 狠狠操一区二区三区| 久久久久久久久久久久久9999| 亚洲国产美女搞黄色| 成人三级av在线| 国产免费人做人爱午夜视频| 亚洲国产中文字幕久久网| 欧美福利专区| 日韩偷拍自拍| 国产中文字幕亚洲| 亚洲欧美一区二区三区极速播放| 99久久99九九99九九九| 91嫩草国产丨精品入口麻豆| 欧美va亚洲va在线观看蝴蝶网| 欧美日韩影院| 国产精品天堂| 亚洲自拍偷拍福利| 欧美性精品220| 欧美在线三级| 国内av一区二区三区| 成人免费网站在线看| 午夜精品一区二区三区电影天堂| 人人精品亚洲| 午夜免费性福利| 国产在线日韩在线| 婷婷开心久久网| 伊人情人综合网| 91福利在线视频| 欧美日韩国产免费一区二区三区| 欧美精品三级日韩久久| 亚洲在线免费| 在线看女人毛片| 中文字幕欧美人与畜| 亚洲片av在线| 懂色av中文字幕一区二区三区| 素人啪啪色综合| 日本女优爱爱视频| 国产999精品久久久影片官网| 亚洲精品国产无天堂网2021| 日韩激情一区| 91高清在线| 在线视频一区观看| 久久好看免费视频| 亚洲欧美日韩中文播放 | 久草在线免费福利资源| 波多野结衣成人在线| 精品视频999| 午夜亚洲性色福利视频| 欧美久久天堂| 18禁免费无码无遮挡不卡网站| 久久久久久久一区二区| 亚洲一区二区视频在线观看| 亚洲在线久久| 99在线视频影院| 国产乱子伦农村叉叉叉| 欧美有码在线观看视频| 欧美日韩一区二区在线播放| 9色精品在线| 成人影院大全| caoporn超碰国产公开| 91最新在线免费观看| 精品国产不卡一区二区三区| 91免费看片在线观看| 久久在线免费| 天堂电影一区| 免费成年网站| 日韩和欧美的一区二区| 久久91亚洲精品中文字幕奶水| 性做久久久久久久久| 日本特黄久久久高潮| 成人资源在线播放| 国产传媒在线播放| 日韩中文字幕组| 动漫3d精品一区二区三区| 亚洲少妇激情视频| 亚洲国产精品一区二区久久 | 在线观看免费网站黄| av磁力番号网| 国产精品第一页在线| 亚洲成年人影院在线| 国产精品麻豆视频| 国产欧美午夜| 日本一区二区三区电影免费观看| 青青草视频在线免费观看| 日本大片免费看| 亚洲综合在线做性| 日韩一区二区欧美| 一本色道亚洲精品aⅴ| av午夜精品一区二区三区| 国产精品99久久| 国产电影一区| 波多野结衣精品| 色在线免费视频| 日日碰狠狠躁久久躁婷婷| 久久99精品国产一区二区三区|