case QImage::Format_RGB32:

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的西鄉(xiāng)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
case QImage::Format_ARGB32:
case QImage::Format_ARGB32_Premultiplied:
for(int i = 0; i height; i ++)
{
const QRgb *pSrc = (QRgb *)image.constScanLine(i);
uchar *pDest = (uchar *)ret.scanLine(i);
for( int j = 0; j width; j ++)
{
pDest[j] = qGray(pSrc[j]);
}
}
break;
}
return ret;
}
當(dāng)客戶端在 發(fā)出POST請(qǐng)求時(shí)/albums,您希望將請(qǐng)求正文中描述的專輯添加到現(xiàn)有專輯數(shù)據(jù)中。
為此,您將編寫以下內(nèi)容:
1、編寫代碼
a.添加代碼以將專輯數(shù)據(jù)添加到專輯列表。
在此代碼中:
1)用于Context.BindJSON 將請(qǐng)求正文綁定到newAlbum。
2) album將從 JSON 初始化的結(jié)構(gòu)附加到albums 切片。
3)向響應(yīng)添加201狀態(tài)代碼,以及表示您添加的專輯的 JSON。
b.更改您的main函數(shù),使其包含該router.POST函數(shù),如下所示。
在此代碼中:
1)將路徑中的POST方法與 /albumspostAlbums函數(shù)相關(guān)聯(lián)。
使用 Gin,您可以將處理程序與 HTTP 方法和路徑組合相關(guān)聯(lián)。這樣,您可以根據(jù)客戶端使用的方法將發(fā)送到單個(gè)路徑的請(qǐng)求單獨(dú)路由。
a.如果服務(wù)器從上一節(jié)開始仍在運(yùn)行,請(qǐng)停止它。
b.從包含 main.go 的目錄中的命令行,運(yùn)行代碼。
c.從不同的命令行窗口,用于curl向正在運(yùn)行的 Web 服務(wù)發(fā)出請(qǐng)求。
該命令應(yīng)顯示添加專輯的標(biāo)題和 JSON。
d.與上一節(jié)一樣,使用curl檢索完整的專輯列表,您可以使用它來確認(rèn)添加了新專輯。
該命令應(yīng)顯示專輯列表。
當(dāng)客戶端向 發(fā)出請(qǐng)求時(shí)GET /albums/[id],您希望返回 ID 與id路徑參數(shù)匹配的專輯。
為此,您將:
a.在您在上一節(jié)中添加的函數(shù)下方postAlbums,粘貼以下代碼以檢索特定專輯。
此getAlbumByID函數(shù)將提取請(qǐng)求路徑中的 ID,然后找到匹配的專輯。
在此代碼中:
(1)Context.Param用于從 URL 中檢索id路徑參數(shù)。當(dāng)您將此處理程序映射到路徑時(shí),您將在路徑中包含參數(shù)的占位符。
(2)循環(huán)album切片中的結(jié)構(gòu),尋找其ID 字段值與id參數(shù)值匹配的結(jié)構(gòu)。如果找到,則將該album結(jié)構(gòu)序列化為 JSON,并將其作為帶有200 OK HTTP 代碼的響應(yīng)返回。
如上所述,實(shí)際使用中的服務(wù)可能會(huì)使用數(shù)據(jù)庫(kù)查詢來執(zhí)行此查找。
(3)如果找不到專輯,則返回 HTTP 404錯(cuò)誤。
b.最后,更改您的main,使其包含對(duì)router.GET的新調(diào)用,路徑現(xiàn)在為/albums/:id ,如以下示例所示。
在此代碼中:
(1)將/albums/:id路徑與getAlbumByID功能相關(guān)聯(lián)。在 Gin 中,路徑中項(xiàng)目前面的冒號(hào)表示該項(xiàng)目是路徑參數(shù)。
a.如果服務(wù)器從上一節(jié)開始仍在運(yùn)行,請(qǐng)停止它。
b.在包含 main.go 的目錄中的命令行中,運(yùn)行代碼以啟動(dòng)服務(wù)器。
c.從不同的命令行窗口,用于curl向正在運(yùn)行的 Web 服務(wù)發(fā)出請(qǐng)求。
該命令應(yīng)顯示您使用其 ID 的專輯的 JSON。如果找不到專輯,您將收到帶有錯(cuò)誤消息的 JSON。
恭喜!您剛剛使用 Go 和 Gin 編寫了一個(gè)簡(jiǎn)單的 RESTful Web 服務(wù)。
本節(jié)包含您使用本教程構(gòu)建的應(yīng)用程序的代碼。
網(wǎng)關(guān)=反向代理+負(fù)載均衡+各種策略,技術(shù)實(shí)現(xiàn)也有多種多樣,有基于 nginx 使用 lua 的實(shí)現(xiàn),比如 openresty、kong;也有基于 zuul 的通用網(wǎng)關(guān);還有就是 golang 的網(wǎng)關(guān),比如 tyk。
這篇文章主要是講如何基于 golang 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)關(guān)。
轉(zhuǎn)自: troy.wang/docs/golang/posts/golang-gateway/
整理:go語言鐘文文檔:
啟動(dòng)兩個(gè)后端 web 服務(wù)(代碼)
這里使用命令行工具進(jìn)行測(cè)試
具體代碼
直接使用基礎(chǔ)庫(kù) httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy對(duì)象實(shí)現(xiàn)了serveHttp方法,因此可以直接作為 handler。
具體代碼
director中定義回調(diào)函數(shù),入?yún)?http.Request,決定如何構(gòu)造向后端的請(qǐng)求,比如 host 是否向后傳遞,是否進(jìn)行 url 重寫,對(duì)于 header 的處理,后端 target 的選擇等,都可以在這里完成。
director在這里具體做了:
modifyResponse中定義回調(diào)函數(shù),入?yún)?http.Response,用于修改響應(yīng)的信息,比如響應(yīng)的 Body,響應(yīng)的 Header 等信息。
最終依舊是返回一個(gè)ReverseProxy,然后將這個(gè)對(duì)象作為 handler 傳入即可。
參考 2.2 中的NewSingleHostReverseProxy,只需要實(shí)現(xiàn)一個(gè)類似的、支持多 targets 的方法即可,具體實(shí)現(xiàn)見后面。
作為一個(gè)網(wǎng)關(guān)服務(wù),在上面 2.3 的基礎(chǔ)上,需要支持必要的負(fù)載均衡策略,比如:
隨便 random 一個(gè)整數(shù)作為索引,然后取對(duì)應(yīng)的地址即可,實(shí)現(xiàn)比較簡(jiǎn)單。
具體代碼
使用curIndex進(jìn)行累加計(jì)數(shù),一旦超過 rss 數(shù)組的長(zhǎng)度,則重置。
具體代碼
輪詢帶權(quán)重,如果使用計(jì)數(shù)遞減的方式,如果權(quán)重是5,1,1那么后端 rs 依次為a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端會(huì)瞬間壓力過大;參考 nginx 內(nèi)部的加權(quán)輪詢,或者應(yīng)該稱之為平滑加權(quán)輪詢,思路是:
后端真實(shí)節(jié)點(diǎn)包含三個(gè)權(quán)重:
操作步驟:
具體代碼
一致性 hash 算法,主要是用于分布式 cache 熱點(diǎn)/命中問題;這里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本滿足流量綁定,一旦后端目標(biāo)節(jié)點(diǎn)故障,會(huì)自動(dòng)平移到環(huán)上最近的那么個(gè)節(jié)點(diǎn)。
實(shí)現(xiàn):
具體代碼
每一種不同的負(fù)載均衡算法,只需要實(shí)現(xiàn)添加以及獲取的接口即可。
然后使用工廠方法,根據(jù)傳入的參數(shù),決定使用哪種負(fù)載均衡策略。
具體代碼
作為網(wǎng)關(guān),中間件必不可少,這類包括請(qǐng)求響應(yīng)的模式,一般稱作洋蔥模式,每一層都是中間件,一層層進(jìn)去,然后一層層出來。
中間件的實(shí)現(xiàn)一般有兩種,一種是使用數(shù)組,然后配合 index 計(jì)數(shù);一種是鏈?zhǔn)秸{(diào)用。
具體代碼
go語言抓包工具的網(wǎng)站:
1,sql2go網(wǎng)。
用于將 sql 語句轉(zhuǎn)換為 golang 的 struct. 使用 ddl 語句即可。
例如對(duì)于創(chuàng)建表的語句: show create table xxx. 將輸出的語句,直接粘貼進(jìn)去就行。
2,toml2go網(wǎng)。
用于將編碼后的 toml 文本轉(zhuǎn)換問 golang 的 struct。
3,curl2go網(wǎng)。
用來將 curl 命令轉(zhuǎn)化為具體的 golang 代碼。
4,json2go網(wǎng)。
用于將 json 文本轉(zhuǎn)換為 struct。
5,mysql 轉(zhuǎn) ES 工具網(wǎng)站。
模擬模板的工具,在支持泛型之前,可以考慮使用。7)查看某一個(gè)庫(kù)的依賴情況,類似于 go list 功能。
GO語言簡(jiǎn)介:
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ì)算。
當(dāng)前有兩個(gè)Go編譯器分支,分別為官方編譯器gc和gccgo。官方編譯器在初期使用C寫成,后用Go重寫從而實(shí)現(xiàn)自舉。Gccgo是一個(gè)使用標(biāo)準(zhǔn)GCC作為后端的Go編譯器。
官方編譯器支持跨平臺(tái)編譯(但不支持CGO),允許將源代碼編譯為可在目標(biāo)系統(tǒng)、架構(gòu)上執(zhí)行的二進(jìn)制文件。
本教程介紹了使用 Godatabase/sql及其標(biāo)準(zhǔn)庫(kù)中的包訪問關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)。
您將使用的database/sql包包括用于連接數(shù)據(jù)庫(kù)、執(zhí)行事務(wù)、取消正在進(jìn)行的操作等的類型和函數(shù)。
在本教程中,您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),然后編寫代碼來訪問該數(shù)據(jù)庫(kù)。您的示例項(xiàng)目將是有關(guān)老式爵士樂唱片的數(shù)據(jù)存儲(chǔ)庫(kù)。
首先,為您要編寫的代碼創(chuàng)建一個(gè)文件夾。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 data-access 的目錄。
3、創(chuàng)建一個(gè)模塊,您可以在其中管理將在本教程中添加的依賴項(xiàng)。
運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。
此命令創(chuàng)建一個(gè) go.mod 文件,您添加的依賴項(xiàng)將在其中列出以供跟蹤。
注意: 在實(shí)際開發(fā)中,您會(huì)指定一個(gè)更符合您自己需求的模塊路徑。有關(guān)更多信息,請(qǐng)參閱一下文章。
GO語言(二十五):管理依賴項(xiàng)(上)
GO語言(二十六):管理依賴項(xiàng)(中)
GO語言(二十七):管理依賴項(xiàng)(下)
接下來,您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。
在此步驟中,您將創(chuàng)建要使用的數(shù)據(jù)庫(kù)。您將使用 DBMS 本身的 CLI 創(chuàng)建數(shù)據(jù)庫(kù)和表,以及添加數(shù)據(jù)。
您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),其中包含有關(guān)黑膠唱片上的老式爵士樂錄音的數(shù)據(jù)。
這里的代碼使用MySQL CLI,但大多數(shù) DBMS 都有自己的 CLI,具有類似的功能。
1、打開一個(gè)新的命令提示符。
在命令行,登錄到您的 DBMS,如下面的 MySQL 示例所示。
2、在mysql命令提示符下,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。
3、切到您剛剛創(chuàng)建的數(shù)據(jù)庫(kù),以便您可以添加表。
4、在文本編輯器的 data-access 文件夾中,創(chuàng)建一個(gè)名為 create-tables.sql 的文件來保存用于添加表的 SQL 腳本。
將以下 SQL 代碼粘貼到文件中,然后保存文件。
在此 SQL 代碼中:
(1)刪除名為album表。 首先執(zhí)行此命令可以讓您更輕松地稍后重新運(yùn)行腳本。
(2)創(chuàng)建一個(gè)album包含四列的表:title、artist和price。每行的id值由 DBMS 自動(dòng)創(chuàng)建。
(3)添加帶有值的四行。
5、在mysql命令提示符下,運(yùn)行您剛剛創(chuàng)建的腳本。
您將使用以下形式的source命令:
6、在 DBMS 命令提示符處,使用SELECT語句來驗(yàn)證您是否已成功創(chuàng)建包含數(shù)據(jù)的表。
接下來,您將編寫一些 Go 代碼進(jìn)行連接,以便進(jìn)行查詢。
現(xiàn)在你已經(jīng)有了一個(gè)包含一些數(shù)據(jù)的數(shù)據(jù)庫(kù),開始你的 Go 代碼。
找到并導(dǎo)入一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,該驅(qū)動(dòng)程序會(huì)將您通過database/sql包中的函數(shù)發(fā)出的請(qǐng)求轉(zhuǎn)換為數(shù)據(jù)庫(kù)可以理解的請(qǐng)求。
1、在您的瀏覽器中,訪問SQLDrivers wiki 頁面以識(shí)別您可以使用的驅(qū)動(dòng)程序。
2、使用頁面上的列表來識(shí)別您將使用的驅(qū)動(dòng)程序。為了在本教程中訪問 MySQL,您將使用 Go-MySQL-Driver。
3、請(qǐng)注意驅(qū)動(dòng)程序的包名稱 - 此處為github.com/go-sql-driver/mysql.
4、使用您的文本編輯器,創(chuàng)建一個(gè)用于編寫 Go 代碼的文件,并將該文件作為 main.go 保存在您之前創(chuàng)建的數(shù)據(jù)訪問目錄中。
5、進(jìn)入main.go,粘貼以下代碼導(dǎo)入驅(qū)動(dòng)包。
在此代碼中:
(1)將您的代碼添加到main包中,以便您可以獨(dú)立執(zhí)行它。
(2)導(dǎo)入 MySQL 驅(qū)動(dòng)程序github.com/go-sql-driver/mysql。
導(dǎo)入驅(qū)動(dòng)程序后,您將開始編寫代碼以訪問數(shù)據(jù)庫(kù)。
現(xiàn)在編寫一些 Go 代碼,讓您使用數(shù)據(jù)庫(kù)句柄訪問數(shù)據(jù)庫(kù)。
您將使用指向結(jié)構(gòu)的指針sql.DB,它表示對(duì)特定數(shù)據(jù)庫(kù)的訪問。
編寫代碼
1、進(jìn)入 main.go,在import您剛剛添加的代碼下方,粘貼以下 Go 代碼以創(chuàng)建數(shù)據(jù)庫(kù)句柄。
在此代碼中:
(3)使用 MySQL 驅(qū)動(dòng)程序Config和FormatDSN類型以收集連接屬性并將它們格式化為連接字符串的 DSN。
該Config結(jié)構(gòu)使代碼比連接字符串更容易閱讀。
(4)調(diào)用sql.Open 初始化db變量,傳遞 FormatDSN。
(5)檢查來自 的錯(cuò)誤sql.Open。例如,如果您的數(shù)據(jù)庫(kù)連接細(xì)節(jié)格式不正確,它可能會(huì)失敗。
為了簡(jiǎn)化代碼,您調(diào)用log.Fatal結(jié)束執(zhí)行并將錯(cuò)誤打印到控制臺(tái)。在生產(chǎn)代碼中,您會(huì)希望以更優(yōu)雅的方式處理錯(cuò)誤。
(6)調(diào)用DB.Ping以確認(rèn)連接到數(shù)據(jù)庫(kù)有效。在運(yùn)行時(shí), sql.Open可能不會(huì)立即連接,具體取決于驅(qū)動(dòng)程序。您在Ping此處使用以確認(rèn) database/sql包可以在需要時(shí)連接。
(7)檢查來自Ping的錯(cuò)誤,以防連接失敗。
(8)Ping如果連接成功,則打印一條消息。
文件的頂部現(xiàn)在應(yīng)該如下所示:
3、保存 main.go。
1、開始跟蹤 MySQL 驅(qū)動(dòng)程序模塊作為依賴項(xiàng)。
使用go get 添加 github.com/go-sql-driver/mysql 模塊作為您自己模塊的依賴項(xiàng)。使用點(diǎn)參數(shù)表示“獲取當(dāng)前目錄中代碼的依賴項(xiàng)”。
2、在命令提示符下,設(shè)置Go 程序使用的DBUSER和DBPASS環(huán)境變量。
在 Linux 或 Mac 上:
在 Windows 上:
3、在包含 main.go 的目錄中的命令行中,通過鍵入go run來運(yùn)行代碼。
連接成功了!
接下來,您將查詢一些數(shù)據(jù)。
本文介紹一些Go語言的基礎(chǔ)語法。
先來看一個(gè)簡(jiǎn)單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來進(jìn)一步介紹go的基礎(chǔ)語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個(gè)標(biāo)準(zhǔn)庫(kù),
常用方法:
示例代碼:
執(zhí)行結(jié)果:
更多格式化方法可以訪問中的fmt包。
log包實(shí)現(xiàn)了簡(jiǎn)單的日志服務(wù),也提供了一些格式化輸出的方法。
執(zhí)行結(jié)果:
下面來介紹一下go的數(shù)據(jù)類型
下表列出了go語言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲(chǔ)的是一個(gè)地址,這個(gè)地址存儲(chǔ)最終的值。
常量是在程序編譯時(shí)就確定下來的值,程序運(yùn)行時(shí)無法改變。
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
Go 語言的運(yùn)算符主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符以及指針相關(guān)運(yùn)算符。
算術(shù)運(yùn)算符:
關(guān)系運(yùn)算符:
邏輯運(yùn)算符:
位運(yùn)算符:
賦值運(yùn)算符:
指針相關(guān)運(yùn)算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會(huì)強(qiáng)制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執(zhí)行結(jié)果:
下面介紹幾種循環(huán)語句:
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
也可以通過標(biāo)記退出循環(huán):
--THE END--
分享文章:go語言獲取網(wǎng)頁代碼,go語言web開發(fā)教程
網(wǎng)頁鏈接:http://chinadenli.net/article18/phshdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站改版、商城網(wǎng)站、微信公眾號(hào)、小程序開發(fā)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)