Go語言 cgo

2018-07-25 16:12 更新

下面是一個使用cgo的例子:

package rand

/*
#include <stdlib.h>
*/
import "C"

func Random() int {
    return int(C.random())
}

func Seed(i int) {
    C.srandom(C.uint(i))
}

rand包導(dǎo)入了"C",但是在Go的標(biāo)準(zhǔn)庫中并沒有一個"C"包。這是因?yàn)?C"是一個偽包,這是一個特殊的名字,cgo通過這個包知道它是引用C命名空間的。Go編譯器使用符號"·"來區(qū)分命名空間,而C編譯器使用不同的約定,因此使用C包中的名字時,Go編譯器就知道應(yīng)該使用C的命名約定。

在將要進(jìn)入這一章之前,請讀者先思考下面一些問題:

  1. Go使用的是分段棧,初始棧大小很小,當(dāng)發(fā)現(xiàn)棧不夠時會動態(tài)增長。動態(tài)增長是通過進(jìn)入函數(shù)時插入檢測指令實(shí)現(xiàn)的。然而C函數(shù)不使用分段棧技術(shù),并且假設(shè)棧是足夠大的。那么Go是如何處理不讓cgo調(diào)用發(fā)生棧溢出的呢?

  2. Go中的goroutine都是協(xié)作式的,運(yùn)行到調(diào)用runtime庫時就有機(jī)會進(jìn)行調(diào)度。然而C函數(shù)是不會與Go的runtime做這種交互的,所以cgo的函數(shù)不是一個協(xié)作式的,那么如何避免進(jìn)入C函數(shù)的這個goroutine“失控”?

  3. cgo不僅僅是從Go調(diào)用C,還包括從C中調(diào)用Go函數(shù)。這里面又有哪些技術(shù)難點(diǎn)?舉個簡單的例子,C中調(diào)用Go函數(shù)f,而f中是使用了go建立新的goroutine的,但是在C中是不支持Go的runtime的。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號