成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

大家好,我是煎魚。

最近因?yàn)楦鞣N奇怪的原因,接觸到了 Go 特色之一 CGO。這方面的相關(guān)內(nèi)容也相對(duì)少一些,給大家拋磚引玉。

圖片

圖片來(lái)源于 marlin

畢竟很多跨語(yǔ)言調(diào)用,還是會(huì)依賴 CGO 這個(gè)特性。希望大家在真正要用時(shí)有個(gè)前置知識(shí)墊肚子。

CGO 是什么

CGO 就是 C 和 Go,兩個(gè)編程語(yǔ)言。指的是能夠創(chuàng)建調(diào)用 C 代碼的 Go 包。對(duì)照著 Go 代碼中的 “C”:

package main

import "C"

func main() {}

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

CGO 對(duì)應(yīng)的環(huán)境變量是 CGO_ENABLED,設(shè)置為 1 則開啟 CGO,為 0 則關(guān)閉 CGO。

編譯命令如下:

CGO_ENABLED=0 go build -o hellojy main.go

當(dāng)然,對(duì)于默認(rèn)值。該環(huán)境變量值為 1,C 編譯器也是使用 gcc。我們可以通過(guò) go env 看到:

圖片

一旦關(guān)閉就會(huì)影響 CGO 編譯。需要特別留意,交叉編譯時(shí)會(huì)默認(rèn)關(guān)閉 CGO。

CGO 快速上手

最小 Demo

先來(lái)一個(gè) CGO 的 Go 例子:

package main

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

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

運(yùn)行 go run main.go,輸出結(jié)果:

hello world.

聲明 C 注解

如果你沒(méi)有了解過(guò) CGO,看到上面的例子,可能會(huì)有好幾個(gè)疑問(wèn)。

首先是 include:

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

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

無(wú)論是:

//#include <stdio.h>

又或是:

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

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

回到 Demo 本身,如果我們?nèi)サ?nbsp;//#include <stdio.h>,再運(yùn)行會(huì)出現(xiàn)如下報(bào)錯(cuò):

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

去掉后,語(yǔ)句 C.puts(s) 將無(wú)法運(yùn)行。

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

其他同理,你在注解中聲明、定義的東西,均可以在 Go 代碼中通過(guò) C 這個(gè)偽包來(lái)引用和調(diào)用。

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

例如:

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 類型對(duì)照

Go 官方有提供一份基礎(chǔ)類型的對(duì)照表,大家可以參照來(lái)使用和理解。

如下:

C 語(yǔ)言類型

CGO 類型

Go語(yǔ)言類型

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

注意事項(xiàng)

使用 CGO,除了會(huì)帶來(lái)一定的性能損耗外。需要特別注意的是:內(nèi)存泄露。因?yàn)?Go 是帶垃圾回收機(jī)制的編程語(yǔ)言,而使用了 C 后,需要手動(dòng)的管理內(nèi)存。

還是這個(gè) Demo:

package main

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

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

如果這是一個(gè)常駐進(jìn)程,也沒(méi)有任何釋放動(dòng)作。用 C.CString 方法所申請(qǐng)的變量 s 就會(huì)泄露。

因此與 “C” 相關(guān)的變量創(chuàng)建,需要進(jìn)行手動(dòng)的內(nèi)存管理。正確的代碼如下:

/*
#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))
}

需要調(diào)用 C.free 方法進(jìn)行主動(dòng)的內(nèi)存釋放。如果該程序自然結(jié)束,也會(huì)自動(dòng)回收。

總結(jié)

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

需要特別注意手動(dòng)內(nèi)存管理、性能損耗等多方面的制約。后續(xù)我們也會(huì)繼續(xù)深入 CGO 方面的內(nèi)容。

責(zé)任編輯:武曉燕 來(lái)源: 腦子進(jìn)煎魚了
相關(guān)推薦

2022-08-23 08:53:31

Go項(xiàng)目語(yǔ)言

2023-09-26 01:21:34

2021-02-02 09:10:12

Go語(yǔ)言二進(jìn)制

2021-02-05 18:22:51

GoC剖析

2022-12-07 09:00:18

錯(cuò)誤異常CGO

2022-12-01 08:15:41

CGOswitcherror

2021-09-29 18:17:30

Go泛型語(yǔ)言

2023-03-27 09:40:01

GoWebAssembl集成

2022-03-25 21:57:49

匯編Go語(yǔ)言

2024-10-30 09:50:51

WebGo語(yǔ)言

2021-11-10 15:37:49

Go源碼指令

2025-02-10 08:49:40

2021-03-10 08:55:42

Go數(shù)據(jù)語(yǔ)言

2023-05-08 07:55:05

快速排序Go 語(yǔ)言

2023-03-29 08:18:16

Go調(diào)試工具

2023-12-01 08:01:33

GoValidator

2012-03-20 09:20:40

Go語(yǔ)言

2025-03-26 00:55:00

2024-05-06 07:53:09

Go并發(fā)編程

2024-04-11 07:40:55

Go并發(fā)編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美综合一区二区三区 | 国产a区| 精品免费观看 | 欧美色偷拍 | 成人国产免费视频 | 久久精品久久久久久 | 久久久日韩精品一区二区三区 | 国产精品国产三级国产aⅴ中文 | 亚洲第一在线 | 男女羞羞视频免费 | 亚洲欧美一区二区三区1000 | 女人av | 国产在线永久免费 | 成人精品区 | 在线观看特色大片免费网站 | 精品欧美一区二区三区久久久 | 欧美精品一区二区三 | 欧美一区二区视频 | 日韩三级免费网站 | 日韩午夜电影 | 黄色国产在线播放 | 国产激情亚洲 | 男人天堂国产 | 久久噜噜噜精品国产亚洲综合 | 美女拍拍拍网站 | 妖精视频一区二区三区 | 九九热精品视频 | 欧美freesex黑人又粗又大 | 在线看91| 日韩美香港a一级毛片免费 国产综合av | 台湾a级理论片在线观看 | 久久国产精品久久国产精品 | 欧美网站一区二区 | 成人午夜av| 美女黄18岁以下禁止观看 | 国产美女一区二区 | 午夜亚洲| 91精品在线播放 | 尤物在线 | 日本一区二区三区在线观看 | 一区二区三区影院 |