go語言加載c分類器 go語言類庫

為什么要使用 Go 語言?Go 語言的優(yōu)勢在哪里?

1、簡單易學(xué)。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、龍華網(wǎng)絡(luò)推廣、微信小程序開發(fā)、龍華網(wǎng)絡(luò)營銷、龍華企業(yè)策劃、龍華品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供龍華建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn

Go語言的作者本身就很懂C語言,所以同樣Go語言也會有C語言的基因,所以對于程序員來說,Go語言天生就會讓人很熟悉,容易上手。

2、并發(fā)性好。

Go語言天生支持并發(fā),可以充分利用多核,輕松地使用并發(fā)。 這是Go語言最大的特點。

描述

Go的語法接近C語言,但對于變量的聲明有所不同。Go支持垃圾回收功能。Go的并行模型是以東尼·霍爾的通信順序進程(CSP)為基礎(chǔ),采取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運算的特征,比如通道傳輸。

在1.8版本中開放插件(Plugin)的支持,這意味著現(xiàn)在能從Go中動態(tài)加載部分函數(shù)。

與C++相比,Go并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能,但增加了 切片(Slice) 型、并發(fā)、管道、垃圾回收、接口(Interface)等特性的語言級支持。

go語言如何調(diào)用c函數(shù)

直接嵌入c源代碼到go代碼里面

package main

/*

#include stdio.h

void myhello(int i) {

printf("Hello C: %d\n", i);

}

*/

import "C"

import "fmt"

func main() {

C.myhello(C.int(12))

fmt.Println("Hello Go");

}

需要注意的是C代碼必須放在注釋里面

import "C"語句和前面的C代碼之間不能有空行

運行結(jié)果

$ go build main.go ./main

Hello C: 12

Hello Go

分開c代碼到單獨文件

嵌在一起代碼結(jié)構(gòu)不是很好看,很多人包括我,還是喜歡把兩個分開,放在不同的文件里面,顯得干凈,go源文件里面是go的源代碼,c源文件里面是c的源代碼。

$ ls

hello.c hello.h main.go

$ cat hello.h

void hello(int);

$ cat hello.c

#include stdio.h

void hello(int i) {

printf("Hello C: %d\n", i);

}

$ cat main.go

package main

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

編譯運行

$ go build ./main

Hello C: 12

Hello Go

編譯成庫文件

如果c文件比較多,最好還是能夠編譯成一個獨立的庫文件,然后go來調(diào)用庫。

$ find mylib main

mylib

mylib/hello.h

mylib/hello.c

main

main/main.go

編譯庫文件

$ cd mylib

# gcc -fPIC -shared -o libhello.so hello.c

編譯go程序

$ cd main

$ cat main.go

package main

// #cgo CFLAGS: -I../mylib

// #cgo LDFLAGS: -L../mylib -lhello

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

$ go build main.go

運行

$ export LD_LIBRARY_PATH=../mylib

$ ./main

Hello C: 12

Hello Go

在我們的例子中,庫文件是編譯成動態(tài)庫的,main程序鏈接的時候也是采用的動態(tài)庫

$ ldd main

linux-vdso.so.1 = (0x00007fffc7968000)

libhello.so = ../mylib/libhello.so (0x00007f513684c000)

libpthread.so.0 = /lib64/libpthread.so.0 (0x00007f5136614000)

libc.so.6 = /lib64/libc.so.6 (0x00007f5136253000)

/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)

理論上講也是可以編譯成整個一靜態(tài)鏈接的可執(zhí)行程序,由于我的機器上缺少靜態(tài)鏈接的系統(tǒng)庫,比如libc.a,所以只能編譯成動態(tài)鏈接。

GoLang -- Gin框架

? 何為框架:

框架一直是敏捷開發(fā)中的利器,能讓開發(fā)者很快的上手并做出應(yīng)用,甚至有的時候,脫離了框架,一些開發(fā)者都不會寫程序了。成長總不會一蹴而就,從寫出程序獲取成就感,再到精通框架,快速構(gòu)造應(yīng)用,當這些方面都得心應(yīng)手的時候,可以嘗試改造一些框架,或是自己創(chuàng)造一個。

Gin是一個golang的微框架,封裝比較優(yōu)雅,API友好,源碼注釋比較明確,已經(jīng)發(fā)布了1.0版本。具有快速靈活,容錯方便等特點。其實對于golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯??蚣芨袷且恍┏S煤瘮?shù)或者工具的集合。借助框架開發(fā),不僅可以省去很多常用的封裝帶來的時間,也有助于團隊的編碼風格和形成規(guī)范。

(1)首先需要安裝,安裝比較簡單,使用go get即可

go get github.com/gin-gonic/gin

如果安裝失敗,直接去Github clone下來,放置到對應(yīng)的目錄即可。

(2)代碼中使用:

下面是一個使用Gin的簡單例子:

package main

import (

"github.com/gin-gonic/gin"

)

func main() {

router := gin.Default()

router.GET("/ping", func(c *gin.Context) {

c.JSON(200, gin.H{

"message": "pong",

})

})

router.Run(":8080") // listen and serve on 0.0.0.0:8080

}

簡單幾行代碼,就能實現(xiàn)一個web服務(wù)。使用gin的Default方法創(chuàng)建一個路由handler。然后通過HTTP方法綁定路由規(guī)則和路由函數(shù)。不同于net/http庫的路由函數(shù),gin進行了封裝,把request和response都封裝到gin.Context的上下文環(huán)境。最后是啟動路由的Run方法監(jiān)聽端口。麻雀雖小,五臟俱全。當然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。

Gin可以很方便的支持各種HTTP請求方法以及返回各種類型的數(shù)據(jù),詳情可以前往查看。

2.1 匹配參數(shù)

我們可以使用Gin框架快速的匹配參數(shù),如下代碼所示:

冒號:加上一個參數(shù)名組成路由參數(shù)。可以使用c.Param的方法讀取其值。當然這個值是字串string。諸如/user/rsj217,和/user/hello都可以匹配,而/user/和/user/rsj217/不會被匹配。

瀏覽器輸入以下測試:

返回結(jié)果為:

其中c.String是gin.Context下提供的方法,用來返回字符串。

其中c.Json是gin.Context下提供的方法,用來返回Json。

下面我們使用以下gin提供的Group函數(shù),方便的為不同的API進行分類。

我們創(chuàng)建了一個gin的默認路由,并為其分配了一個組 v1,監(jiān)聽hello請求并將其路由到視圖函數(shù)HelloPage,最后綁定到 0.0.0.0:8000

C.JSON是Gin實現(xiàn)的返回json數(shù)據(jù)的內(nèi)置方法,包含了2個參數(shù),狀態(tài)碼和返回的內(nèi)容。http.StatusOK代表返回狀態(tài)碼為200,正文為{"message": “welcome"}。

注:Gin還包含更多的返回方法如c.String, c.HTML, c.XML等,請自行了解??梢苑奖愕姆祷豀TML數(shù)據(jù)

我們在之前的組v1路由下新定義一個路由:

下面我們訪問

可以看到,通過c.Param(“key”)方法,Gin成功捕獲了url請求路徑中的參數(shù)。同理,gin也可以捕獲常規(guī)參數(shù),如下代碼所示:

在瀏覽器輸入以下代碼:

通過c.Query(“key”)可以成功接收到url參數(shù),c.DefaultQuery在參數(shù)不存在的情況下,會由其默認值代替。

我們還可以為Gin定義一些默認路由:

這時候,我們訪問一個不存在的頁面:

返回如下所示:

下面我們測試在Gin里面使用Post

在測試端輸入:

附帶發(fā)送的數(shù)據(jù),測試即可。記住需要使用POST方法.

繼續(xù)修改,將PostHandler的函數(shù)修改如下

測試工具輸入:

發(fā)送的內(nèi)容輸入:

返回結(jié)果如下:

備注:此處需要指定Content-Type為application/x-www-form-urlencoded,否則識別不出來。

一定要選擇對應(yīng)的PUT或者DELETE方法。

Gin框架快速的創(chuàng)建路由

能夠方便的創(chuàng)建分組

支持url正則表達式

支持參數(shù)查找(c.Param c.Query c.PostForm)

請求方法精準匹配

支持404處理

快速的返回給客戶端數(shù)據(jù),常用的c.String c.JSON c.Data

分享標題:go語言加載c分類器 go語言類庫
分享地址:http://muchs.cn/article10/dohegdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站維護、域名注冊、動態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、外貿(mào)建站

廣告

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

成都seo排名網(wǎng)站優(yōu)化