<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 3.9.1 與 C 進行交互 工具 cgo 提供了對 FFI(外部函數接口)的支持,能夠使用 Go 代碼安全地調用 C 語言庫,你可以訪問 cgo 文檔主頁:[http://golang.org/cmd/cgo](http://golang.org/cmd/cgo)。cgo 會替代 Go 編譯器來產生可以組合在同一個包中的 Go 和 C 代碼。在實際開發中一般使用 cgo 創建單獨的 C 代碼包。 如果你想要在你的 Go 程序中使用 cgo,則必須在單獨的一行使用?`import "C"`?來導入,一般來說你可能還需要?`import "unsafe"`。 然后,你可以在?`import "C"`?之前使用注釋(單行或多行注釋均可)的形式導入 C 語言庫(甚至有效的 C 語言代碼),它們之間沒有空行,例如: ~~~ // #include <stdio.h> // #include <stdlib.h> import "C" ~~~ 名稱 "C" 并不屬于標準庫的一部分,這只是 cgo 集成的一個特殊名稱用于引用 C 的命名空間。在這個命名空間里所包含的 C 類型都可以被使用,例如?`C.uint`、`C.long`?等等,還有 libc 中的函數?`C.random()`?等也可以被調用。 當你想要使用某個類型作為 C 中函數的參數時,必須將其轉換為 C 中的類型,反之亦然,例如: ~~~ var i int C.uint(i) // 從 Go 中的 int 轉換為 C 中的無符號 int int(C.random()) // 從 C 中 random() 函數返回的 long 轉換為 Go 中的 int ~~~ 下面的 2 個 Go 函數?`Random()`?和?`Seed()`?分別調用了 C 中的?`C.random()`?和?`C.srandom()`。 示例 3.2?[c1.go](https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/examples/chapter_3/CandGo/c1.go) ~~~ package rand // #include <stdlib.h> import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) } ~~~ C 當中并沒有明確的字符串類型,如果你想要將一個 string 類型的變量從 Go 轉換到 C 時,可以使用?`C.CString(s)`;同樣,可以使用?`C.GoString(cs)`?從 C 轉換到 Go 中的 string 類型。 Go 的內存管理機制無法管理通過 C 代碼分配的內存。 開發人員需要通過手動調用?`C.free`?來釋放變量的內存: ~~~ defer C.free(unsafe.Pointer(Cvariable)) ~~~ 這一行最好緊跟在使用 C 代碼創建某個變量之后,這樣就不會忘記釋放內存了。下面的代碼展示了如何使用 cgo 創建變量、使用并釋放其內存: 示例 3.3?[c2.go](https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/examples/chapter_3/CandGo/c2.go) ~~~ package print // #include <stdio.h> // #include <stdlib.h> import "C" import "unsafe" func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) } ~~~ **構建 cgo 包** 你可以在使用將會在第 9.5 節講到的 Makefile 文件(因為我們使用了一個獨立的包),除了使用變量 GOFILES 之外,還需要使用變量 CGOFILES 來列出需要使用 cgo 編譯的文件列表。例如,示例 3.2 中的代碼就可以使用包含以下內容的 Makefile 文件來編譯,你可以使用 gomake 或 make: ~~~ include $(GOROOT)/src/Make.inc TARG=rand CGOFILES=\ c1.go\ include $(GOROOT)/src/Make.pkg ~~~ # [](https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/03.9.md#392-與-c-進行交互)3.9.2 與 C++ 進行交互 SWIG(簡化封裝器和接口生成器)支持在 Linux 系統下使用 Go 代碼調用 C 或者 C++ 代碼。這里有一些使用 SWIG 的注意事項: * 編寫需要封裝的庫的 SWIG 接口。 * SWIG 會產生 C 的存根函數。 * 這些庫可以使用 cgo 來調用。 * 相關的 Go 文件也可以被自動生成。 這類接口支持方法重載、多重繼承以及使用 Go 代碼實現 C++ 的抽象類。 目前使用 SWIG 存在的一個問題是它無法支持所有的 C++ 庫,比如說它就無法解析 TObject.h。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看