老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)

go語言請求靜態(tài)資源 golang靜態(tài)變量

使用golang 還有必要使用 nginx 么

有必要,因?yàn)镹ginx是專業(yè)的完備的HTTP/HTTPS服務(wù)器,像很多服務(wù)如PHP-FPM,Java Tomcat,Node普遍都躲在Nginx后面跑,這樣做的好處就是后端語言只處理自己的請求,不需要處理各種靜態(tài)資源(img/css/js/file)的請求,比如用戶下載一個大文件,如果是后端語言自己處理,那肯定會拖累應(yīng)用性能,但如果委托給Nginx(X-Accel-Redirect: file_path),Nginx就會用自己的AIO線程池來實(shí)現(xiàn)大文件下載支持,就不需要后端語言費(fèi)力去折騰.

為洞頭等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及洞頭網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、洞頭網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

go語言的webengine叫什么

Java教程

Linux入門

更多

首頁

?

Go語言WEB框架(Gin)詳解

在 Go語言開發(fā)的 Web 框架中,有兩款著名 Web 框架分別是 Martini 和 Gin,兩款 Web 框架相比較的話,Gin 自己說它比 Martini 要強(qiáng)很多。

Gin 是 Go語言寫的一個 web 框架,它具有運(yùn)行速度快,分組的路由器,良好的崩潰捕獲和錯誤處理,非常好的支持中間件和 json??傊?Go語言開發(fā)領(lǐng)域是一款值得好好研究的 Web 框架,開源網(wǎng)址:

首先下載安裝 gin 包:

go get -u github點(diǎn)抗 /gin-gonic/gin

一個簡單的例子:

package main

import "github點(diǎn)抗 /gin-gonic/gin"

func main() {

//Default返回一個默認(rèn)的路由引擎

r := gin.Default()

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

//輸出json結(jié)果給調(diào)用方

c.JSON(200, gin.H{

"message": "pong",

})

})

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

}

編譯運(yùn)行程序,打開瀏覽器,訪問頁面顯示:

{"message":"pong"}

gin 的功能不只是簡單輸出 Json 數(shù)據(jù)。它是一個輕量級的 WEB 框架,支持 RestFull 風(fēng)格 API,支持 GET,POST,PUT,PATCH,DELETE,OPTIONS 等 http 方法,支持文件上傳,分組路由,Multipart/Urlencoded FORM,以及支持 JsonP,參數(shù)處理等等功能,這些都和 WEB 緊密相關(guān),通過提供這些功能,使開發(fā)人員更方便地處理 WEB 業(yè)務(wù)。

Gin 實(shí)際應(yīng)用

接下來使用 Gin 作為框架來搭建一個擁有靜態(tài)資源站點(diǎn),動態(tài) WEB 站點(diǎn),以及 RESTFull API 接口站點(diǎn)(可專門作為手機(jī) APP 應(yīng)用提供服務(wù)使用)組成的,亦可根據(jù)情況分拆這套系統(tǒng),每種功能獨(dú)立出來單獨(dú)提供服務(wù)。

下面按照一套系統(tǒng)但采用分站點(diǎn)來說明,首先是整個系統(tǒng)的目錄結(jié)構(gòu),website 目錄下面 static 是資源類文件,為靜態(tài)資源站點(diǎn)專用;photo 目錄是 UGC 上傳圖片目錄,tpl 是動態(tài)站點(diǎn)的模板。

當(dāng)然這個目錄結(jié)構(gòu)是一種約定,可以根據(jù)情況來修改。整個項(xiàng)目已經(jīng)開源,可以訪問來詳細(xì)了解:具體每個站點(diǎn)的功能怎么實(shí)現(xiàn)呢?請看下面有關(guān)每個功能的講述:

靜態(tài)資源站點(diǎn)

一般網(wǎng)站開發(fā)中,我們會考慮把 js,css,以及資源圖片放在一起,作為靜態(tài)站點(diǎn)部署在 CDN,提升響應(yīng)速度。采用 Gin 實(shí)現(xiàn)起來非常簡單,當(dāng)然也可以使用 net/http 包輕松實(shí)現(xiàn),但使用 Gin 會更方便。

不管怎么樣,使用 Go 開發(fā),我們可以不用花太多時間在 WEB 服務(wù)環(huán)境搭建上,程序啟動就直接可以提供 WEB 服務(wù)了。

package main

import (

"net/http"

"github點(diǎn)抗 /gin-gonic/gin"

)

func main() {

router := gin.Default()

// 靜態(tài)資源加載,本例為css,js以及資源圖片

router.StaticFS("/public", http.Dir("D:/goproject/src/github點(diǎn)抗 /ffhelicopter/tmm/website/static"))

router.StaticFile("/favicon.ico", "./resources/favicon.ico")

// Listen and serve on 0.0.0.0:80

router.Run(":80")

}

首先需要是生成一個 Engine,這是 gin 的核心,默認(rèn)帶有 Logger 和 Recovery 兩個中間件。

router := gin.Default()

StaticFile 是加載單個文件,而 StaticFS 是加載一個完整的目錄資源:

func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes

func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes

這些目錄下資源是可以隨時更新,而不用重新啟動程序?,F(xiàn)在編譯運(yùn)行程序,靜態(tài)站點(diǎn)就可以正常訪問了。

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

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

舉例說明一下. 下面是一個Go語言包, 包含了兩個函數(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)容. 開始是一個包的導(dǎo)入語句.

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

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

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

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

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

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

Seed函數(shù)則相反. 它接受一個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的文檔中有完整的類型列表.

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

/*

#include stdlib.h

*/ import "C"

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

Strings and things

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

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

下一個例子是實(shí)現(xiàn)一個Print函數(shù), 它使用C標(biāo)準(zhǔn)庫中的fputs函數(shù)把一個字符串寫到標(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)建一個C字符串時(或者其它類型的C語言內(nèi)存分配), 你必需記得在使用完后用C.free來釋放它.

調(diào)用C.CString將返回一個指向字符數(shù)組開始處的指錯, 所以在函數(shù)退出前我們把它轉(zhuǎn)換成一個unsafe.Pointer(Go中與C的void 等價的東西), 使用C.free來釋放分配的內(nèi)存. 一個慣用法是在分配內(nèi)存后緊跟一個defer(特別是當(dāng)這段代碼比較復(fù)雜的時候), 這樣我們就有了下面這個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命令, 它就能自動識別這個特殊的import "C", 然后自動使用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的例子給出了更多更高級的用法.

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

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

Go語言事件請求處理程序(Event Handler)

在Go語言的代碼中,您需要引入官方的SDK庫 aliyun/serverless/fc-runtime-go-sdk/fc,并實(shí)現(xiàn)handler函數(shù)和main函數(shù)。 示例如下:

傳入的event參數(shù)是一個包含key屬性的JSON字符串,示例如下。

具體的示例解析如下:

有效的Event Handler簽名如下:

其中,InputType和OutputType與encoding/json標(biāo)準(zhǔn)庫兼容。

Event Handler的使用需遵循以下規(guī)則:

事件函數(shù)的Handler示例代碼:


網(wǎng)站標(biāo)題:go語言請求靜態(tài)資源 golang靜態(tài)變量
轉(zhuǎn)載來于:http://www.xueling.net.cn/article/ddipigj.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 日日躁夜夜躁狠狠躁aⅴ蜜 国产精品人成A片一区二区 | 成人亚洲一区二区三区在线 | 亚洲第一在线综合网站 | 热99精品视频 | 男人一边吃奶一边弄下边好爽 | 在线日本中文字幕 | 手机看片毛片日韩免费观看 | 1204国产成人精品视频 | 欧美少妇在线观看 | 在线观看亚洲av每日更新 | 欧美午夜精品一区二区三区 | 无码少妇一区二区三区免费 | 日本伦理一区二区 | 色欲色欲日韩WWW在线观看 | 亚洲香蕉成人AV网站在线观看 | 中文字幕Va一区二区三区 | 久久精品女人天堂av免费观看 | 国产精品亚洲一区在现观看 | 高清日本欧美久久 | 五月丁香六月狠狠爱综合 | 午夜成人免费视频 | 国产一区二区三区精品欧美日韩一区二区三区 | 动漫精品久久久 | 少妇高潮大叫好爽 | 好硬啊进得太深了A片无码公司 | 国产毛片精品 | 中文字幕av色 | 绯色一区二区二区av免费 | 日本精品在线免费观看网址 | 18禁裸乳无遮挡啪啪无码免费 | 色哟哟vip | 国产成年人在线 | 久久久久久国产精品 | 熟女人妻AV完整一区二区三区 | 午夜精品成人 | 免费A片国产毛无码A片牛牛 | 久久av片免费一区二区三区 | 久久亚洲av成人无码国产最大 | 插插插操操操 | 精品麻豆入口免费 | 成人无码黄动漫在线播放 |