go和c語言類型轉(zhuǎn)換通用 go語言與c

go和c++的區(qū)別

Go(又稱?Golang)是?Google?的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型語言。Go 語言語法與?C?相近,但功能上有:內(nèi)存安全,GC(垃圾回收),結(jié)構(gòu)形態(tài)及 CSP-style?并發(fā)計(jì)算。

創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來,先為開州等服務(wù)建站,開州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為開州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

Go的語法接近C語言,但對于變量的聲明有所不同。Go支持垃圾回收功能。Go的并行模型是以東尼·霍爾的通信順序進(jìn)程(CSP)為基礎(chǔ),采取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運(yùn)算的特征,比如通道傳輸。在1.8版本中開放插件(Plugin)的支持,這意味著現(xiàn)在能從Go中動(dòng)態(tài)加載部分函數(shù)。

與C++相比,Go并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能,但增加了 切片(Slice) 型、并發(fā)、管道、垃圾回收、接口(Interface)等特性的語言級支持。Go 2.0版本將支持泛型,對于斷言的存在,則持負(fù)面態(tài)度,同時(shí)也為自己不提供類型繼承來辯護(hù)。

在Go中有幾項(xiàng)規(guī)定,當(dāng)不匹配以下規(guī)定時(shí)編譯將會(huì)產(chǎn)生錯(cuò)誤。

每行程序結(jié)束后不需要撰寫分號(;)。

大括號({)不能夠換行放置。

if判斷式和for循環(huán)不需要以小括號包覆起來。

參考:百度百科

c語言的 char** 和 golang []string類型怎么相互轉(zhuǎn)換?

當(dāng)a是一個(gè)指針的時(shí)候,*a就是這個(gè)指針指向的內(nèi)存的值 在定義的時(shí)候加了*的都是指針變量,都是一個(gè)地址。 在賦值的時(shí)候加了*的都是表示這個(gè)指針指向內(nèi)存的值,在等號前面就是給這個(gè)值賦值,后面就是取這個(gè)值。

如何在golang 中調(diào)用c的靜態(tài)庫或者動(dòng)態(tài)庫

Cgo 使得Go程序能夠調(diào)用C代碼. cgo讀入一個(gè)用特別的格式寫的Go語言源文件, 輸出Go和C程序, 使得C程序能打包到Go語言的程序包中.

舉例說明一下. 下面是一個(gè)Go語言包, 包含了兩個(gè)函數(shù) -- Random 和 Seed -- 是C語言庫中random和srandom函數(shù)的馬甲.

package rand

/*

#include stdlib.h

*/ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }

我們來看一下這里都有什么內(nèi)容. 開始是一個(gè)包的導(dǎo)入語句.

rand包導(dǎo)入了"C"包, 但你會(huì)發(fā)現(xiàn)在Go的標(biāo)準(zhǔn)庫里沒有這個(gè)包. 那是因?yàn)镃是一個(gè)"偽包", 一個(gè)為cgo引入的特殊的包名, 它是C命名空間的一個(gè)引用.

rand 包包含4個(gè)到C包的引用: 調(diào)用 C.random和C.srandom, 類型轉(zhuǎn)換 C.uint(i)還有引用語句.

Random函數(shù)調(diào)用libc中的random函數(shù), 然后回返結(jié)果. 在C中, random返回一個(gè)C類型的長整形值, cgo把它輪換為C.long. 這個(gè)值必需轉(zhuǎn)換成Go的類型, 才能在Go程序中使用. 使用一個(gè)常見的Go類型轉(zhuǎn)換:

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

這是一個(gè)等價(jià)的函數(shù), 使用了一個(gè)臨時(shí)變量來進(jìn)行類型轉(zhuǎn)換:

func Random() int { var r C.long = C.random() return int(r) }

Seed函數(shù)則相反. 它接受一個(gè)Go語言的int類型, 轉(zhuǎn)換成C語言的unsigned int類型, 然后傳遞給C的srandom函數(shù).

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

需要注意的是, cgo中的unsigned int類型寫為C.uint; cgo的文檔中有完整的類型列表.

這個(gè)例子中還有一個(gè)細(xì)節(jié)我們沒有說到, 那就是導(dǎo)入語句上面的注釋.

/*

#include stdlib.h

*/ import "C"

Cgo可以識別這個(gè)注釋, 并在編譯C語言程序的時(shí)候?qū)⑺?dāng)作一個(gè)頭文件來處理. 在這個(gè)例子中, 它只是一個(gè)include語句, 然而其實(shí)它可以是使用有效的C語言代碼. 這個(gè)注釋必需緊靠在import "C"這個(gè)語句的上面, 不能有空行, 就像是文檔注釋一樣.

Strings and things

與Go語言不同, C語言中沒有顯式的字符串類型. 字符串在C語言中是一個(gè)以0結(jié)尾的字符數(shù)組.

Go和C語言中的字符串轉(zhuǎn)換是通過C.CString, C.GoString,和C.GoStringN這些函數(shù)進(jìn)行的. 這些轉(zhuǎn)換將得到字符串類型的一個(gè)副本.

下一個(gè)例子是實(shí)現(xiàn)一個(gè)Print函數(shù), 它使用C標(biāo)準(zhǔn)庫中的fputs函數(shù)把一個(gè)字符串寫到標(biāo)準(zhǔn)輸出上:

package print // #include stdio.h // #include stdlib.h import "C" import "unsafe" func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }

在C程序中進(jìn)行的內(nèi)存分配是不能被Go語言的內(nèi)存管理器感知的. 當(dāng)你使用C.CString創(chuàng)建一個(gè)C字符串時(shí)(或者其它類型的C語言內(nèi)存分配), 你必需記得在使用完后用C.free來釋放它.

調(diào)用C.CString將返回一個(gè)指向字符數(shù)組開始處的指錯(cuò), 所以在函數(shù)退出前我們把它轉(zhuǎn)換成一個(gè)unsafe.Pointer(Go中與C的void 等價(jià)的東西), 使用C.free來釋放分配的內(nèi)存. 一個(gè)慣用法是在分配內(nèi)存后緊跟一個(gè)defer(特別是當(dāng)這段代碼比較復(fù)雜的時(shí)候), 這樣我們就有了下面這個(gè)Print函數(shù):

func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }

構(gòu)建 cgo 包

如果你使用goinstall, 構(gòu)建cgo包就比較容易了, 只要調(diào)用像平常一樣使用goinstall命令, 它就能自動(dòng)識別這個(gè)特殊的import "C", 然后自動(dòng)使用cgo來編譯這些文件.

如果你想使用Go的Makefiles來構(gòu)建, 那在CGOFILES變量中列出那些要用cgo處理的文件, 就像GOFILES變量包含一般的Go源文件一樣.

rand包的Makefile可以寫成下面這樣:

include $(GOROOT)/src/Make.inc

TARG=goblog/rand

CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg

然后輸入gomake開始構(gòu)建.

更多 cgo 的資源

cgo的文檔中包含了關(guān)于C偽包的更多詳細(xì)的說明, 以及構(gòu)建過程. Go代碼樹中的cgo的例子給出了更多更高級的用法.

一個(gè)簡單而又符合Go慣用法的基于cgo的包是Russ Cox寫的gosqlite. 而Go語言的網(wǎng)站上也列出了更多的的cgo包.

最后, 如果你對于cgo的內(nèi)部是怎么運(yùn)作這個(gè)事情感到好奇的話, 去看看運(yùn)行時(shí)包的cgocall.c文件的注釋吧.

go類型轉(zhuǎn)換

type_name(expression)

float跟int可以互轉(zhuǎn),但是會(huì)丟失所有精度。

func AppendBool(dst []byte, b bool) []byte

AppendBool 根據(jù) b 的值將“true”或“false”附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int) []byte

AppendFloat 將由 FormatFloat 生成的浮點(diǎn)數(shù) f 的字符串形式附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendInt(dst []byte, i int64, base int) []byte

AppendInt 將由 FormatInt 生成的整數(shù)i的字符串形式附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendQuote(dst []byte, s string) []byte

AppendQuote 將由 Quote 生成的代表 s 的雙引號 Go 字符串文字附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendQuoteRune(dst []byte, r rune) []byte

AppendQuoteRune 將由 QuoteRune 生成的表示符文的單引號 Go 字符文字附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendQuoteRuneToASCII(dst []byte, r rune) []byte

AppendQuoteRuneToASCII 將由 QuoteRuneToASCII 生成的代表該符文的單引號 Go 字符文字附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendQuoteRuneToGraphic(dst []byte, r rune) []byte

AppendQuoteRuneToGraphic 將由 QuoteRuneToGraphic 生成的表示符文的單引號 Go 字符文字附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendQuoteToASCII(dst []byte, s string) []byte

AppendQuoteToASCII 將由 QuoteToASCII 生成的代表 s 的雙引號 Go 字符串文字附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendQuoteToGraphic(dst []byte, s string) []byte

AppendQuoteToGraphic 將由 QuoteToGraphic 生成的代表 s 的雙引號 Go 字符串文字附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func AppendUint(dst []byte, i uint64, base int) []byte

AppendUint 將由 FormatUint 生成的無符號整數(shù) i 的字符串形式附加到 dst 并返回?cái)U(kuò)展緩沖區(qū)。

func Atoi(s string) (int, error)

Atoi 返回 ParseInt(s, 10, 0) 轉(zhuǎn)換為 int 類型的結(jié)果。

func CanBackquote(s string) bool

CanBackquote 報(bào)告字符串 s 是否可以不改變?yōu)閱涡蟹匆栕址话?tab 以外的控制字符。

func FormatBool(b bool) string

FormatBool 根據(jù) b 的值返回“true”或“false”

func FormatFloat(f float64, fmt byte, prec, bitSize int) string

FormatFloat 根據(jù)格式 fmt 和 precision prec 將浮點(diǎn)數(shù)f轉(zhuǎn)換為字符串。它將結(jié)果進(jìn)行四舍五入,假設(shè)原始數(shù)據(jù)是從 bitSize 位的浮點(diǎn)值獲得的(float32為32,float64為64)。

格式 fmt 是 'b'(-ddddp±ddd,二進(jìn)制指數(shù)),'e'(-d.dddde±dd,十進(jìn)制指數(shù)),'E'(-d.ddddE±dd,十進(jìn)制指數(shù)),'f'(-ddd.dddd,無指數(shù)),'g'('e'表示大指數(shù),'f'表示否則)或 'G'('E'表示大指數(shù),否則'f')。

precision prec 控制由 'e','E','f','g' 和 'G' 格式打印的位數(shù)(不包括指數(shù))。對于 'e','E' 和 'f',它是小數(shù)點(diǎn)后的位數(shù)。對于 'g' 和 'G' 這是總位數(shù)。特殊精度-1使用必需的最小位數(shù),以便 ParseFloat 完全返回 f 。

func FormatInt(i int64, base int) string

FormatInt 返回給定基數(shù)中的i的字符串表示,對于2 = base = 36.結(jié)果對于數(shù)字值 = 10使用小寫字母 'a' 到 'z' 。

func FormatUint(i uint64, base int) string

FormatUint 返回給定基數(shù)中的 i 的字符串表示,對于2 = base = 36.結(jié)果對于數(shù)字值 = 10使用小寫字母 'a' 到 'z' 。

func IsGraphic(r rune) bool

IsGraphic 報(bào)告符文是否被 Unicode 定義為 Graphic。這些字符包括類別 L,M,N,P,S 和 Z 中的字母,標(biāo)記,數(shù)字,標(biāo)點(diǎn),符號和空格。

func IsPrint(r rune) bool

IsPrint 報(bào)告該符文是否被 Go 定義為可打印,其定義與 unicode.IsPrint 相同:字母,數(shù)字,標(biāo)點(diǎn),符號和 ASCII 空格。

func Itoa(i int) string

Itoa 是 FormatInt(int64(i), 10) 的縮寫。

func ParseBool(str string) (bool, error)

ParseBool 返回字符串表示的布爾值。它接受1,t,T,TRUE,true,True,0,f,F(xiàn),F(xiàn)ALSE,false,F(xiàn)alse。任何其他值都會(huì)返回錯(cuò)誤。

func ParseFloat(s string, bitSize int) (float64, error)

ParseFloat 將字符串 s 轉(zhuǎn)換為浮點(diǎn)數(shù),精度由 bitSize:32指定,float32為64; float64為64。當(dāng) bitSize = 32時(shí),結(jié)果仍然具有 float64 類型,但可以在不更改其值的情況下將其轉(zhuǎn)換為 float32。

如果s格式良好且接近有效的浮點(diǎn)數(shù),則 ParseFloat 返回使用 IEEE754 無偏舍入舍入的最近浮點(diǎn)數(shù)。

ParseFloat 返回的錯(cuò)誤具有具體類型 * NumError 并包含 err.Num = s。

如果 s 在語法上不是格式良好的,ParseFloat 返回 err.Err = ErrSyntax。

如果 s 在語法上格式良好,但距離給定大小的最大浮點(diǎn)數(shù)大于1/2 ULP,則 ParseFloat 返回 f =±Inf,err.Err = ErrRange。

func ParseInt(s string, base int, bitSize int) (i int64, err error)

ParseInt 解釋給定基礎(chǔ)(2到36)中的字符串 s 并返回相應(yīng)的值 i。如果 base == 0,則基數(shù)由字符串的前綴隱含:base 16代表“0x”,base 8代表“0”,否則以10為底數(shù)。

bitSize 參數(shù)指定結(jié)果必須適合的整數(shù)類型。位大小 0,8,16,32 和 64 對應(yīng)于 int,int8,int16,int32 和 int64。

ParseInt 返回的錯(cuò)誤具有具體類型 * NumError 并包含err.Num = s。如果s為空或包含無效數(shù)字,則 err.Err = ErrSyntax,返回值為0; 如果與s對應(yīng)的值不能用給定大小的有符號整數(shù)表示,則 err.Err = ErrRange,返回的值是相應(yīng) bitSize 和符號的最大幅度整數(shù)。

func ParseUint(s string, base int, bitSize int) (uint64, error)

ParseUint 就像 ParseInt,但是對于無符號數(shù)字。

func Quote(s string) string

Quote 返回一個(gè)雙引號的 Go 字符串字面表示s。返回的字符串使用 Go 轉(zhuǎn)義序列 (\t, \n, \xFF, \u0100) 作為 IsPrint 定義的控制字符和非可打印字符。

func QuoteRune(r rune) string

QuoteRune 返回一個(gè)表示符文的單引號 Go 字符。返回的字符串使用 Go 轉(zhuǎn)義序列(\t, \n, \xFF, \u0100) 作為 IsPrint 定義的控制字符和非可打印字符。

func QuoteRuneToASCII(r rune) string

QuoteRuneToASCII 返回表示符文的單引號 Go 字符。對于非 ASCII 字符和 IsPrint 定義的非可打印字符,返回的字符串使用 Go 轉(zhuǎn)義序列 (\t, \n, \xFF, \u0100)。

func QuoteRuneToGraphic(r rune) string

QuoteRuneToGraphic 返回代表符文的單引號 Go 字符。對于非 ASCII 字符和 IsGraphic 定義的非可打印字符,返回的字符串使用Go轉(zhuǎn)義序列 (\t, \n, \xFF, \u0100)。

func QuoteToASCII(s string) string

QuoteToASCII 返回一個(gè)代表 s 的雙引號 Go 字符串。對于非 ASCII 字符和 IsPrint 定義的非可打印字符,返回的字符串使用 Go 轉(zhuǎn)義序列 (\t, \n, \xFF, \u0100) 。

func QuoteToGraphic(s string) string

QuoteToGraphic 返回一個(gè)代表 s 的雙引號 Go 字符串。對于非 ASCII 字符和 IsGraphic 定義的非可打印字符,返回的字符串使用 Go 轉(zhuǎn)義序列 (\t, \n, \xFF, \u0100)。

func Unquote(s string) (string, error)

Unquote 將 s 解釋為單引號,雙引號或反引號的 Go 字符串文字,返回引用的字符串值。(如果 s 是單引號,它將是一個(gè) Go 字符字面量; Unquote 會(huì)返回相應(yīng)的一個(gè)字符字符串。)

網(wǎng)站欄目:go和c語言類型轉(zhuǎn)換通用 go語言與c
網(wǎng)站地址:http://muchs.cn/article44/dosheee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、響應(yīng)式網(wǎng)站、搜索引擎優(yōu)化、外貿(mào)建站、微信公眾號、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)