欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言42章,go語言實戰(zhàn)筆記

GO語言(三十):訪問關(guān)系型數(shù)據(jù)庫(上)

本教程介紹了使用 Godatabase/sql及其標準庫中的包訪問關(guān)系數(shù)據(jù)庫的基礎(chǔ)知識。

在安徽等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設計制作專業(yè)公司,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,全網(wǎng)整合營銷推廣,外貿(mào)網(wǎng)站制作,安徽網(wǎng)站建設費用合理。

您將使用的database/sql包包括用于連接數(shù)據(jù)庫、執(zhí)行事務、取消正在進行的操作等的類型和函數(shù)。

在本教程中,您將創(chuàng)建一個數(shù)據(jù)庫,然后編寫代碼來訪問該數(shù)據(jù)庫。您的示例項目將是有關(guān)老式爵士樂唱片的數(shù)據(jù)存儲庫。

首先,為您要編寫的代碼創(chuàng)建一個文件夾。

1、打開命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個名為 data-access 的目錄。

3、創(chuàng)建一個模塊,您可以在其中管理將在本教程中添加的依賴項。

運行g(shù)o mod init命令,為其提供新代碼的模塊路徑。

此命令創(chuàng)建一個 go.mod 文件,您添加的依賴項將在其中列出以供跟蹤。

注意: 在實際開發(fā)中,您會指定一個更符合您自己需求的模塊路徑。有關(guān)更多信息,請參閱一下文章。

GO語言(二十五):管理依賴項(上)

GO語言(二十六):管理依賴項(中)

GO語言(二十七):管理依賴項(下)

接下來,您將創(chuàng)建一個數(shù)據(jù)庫。

在此步驟中,您將創(chuàng)建要使用的數(shù)據(jù)庫。您將使用 DBMS 本身的 CLI 創(chuàng)建數(shù)據(jù)庫和表,以及添加數(shù)據(jù)。

您將創(chuàng)建一個數(shù)據(jù)庫,其中包含有關(guān)黑膠唱片上的老式爵士樂錄音的數(shù)據(jù)。

這里的代碼使用MySQL CLI,但大多數(shù) DBMS 都有自己的 CLI,具有類似的功能。

1、打開一個新的命令提示符。

在命令行,登錄到您的 DBMS,如下面的 MySQL 示例所示。

2、在mysql命令提示符下,創(chuàng)建一個數(shù)據(jù)庫。

3、切到您剛剛創(chuàng)建的數(shù)據(jù)庫,以便您可以添加表。

4、在文本編輯器的 data-access 文件夾中,創(chuàng)建一個名為 create-tables.sql 的文件來保存用于添加表的 SQL 腳本。

將以下 SQL 代碼粘貼到文件中,然后保存文件。

在此 SQL 代碼中:

(1)刪除名為album表。 首先執(zhí)行此命令可以讓您更輕松地稍后重新運行腳本。

(2)創(chuàng)建一個album包含四列的表:title、artist和price。每行的id值由 DBMS 自動創(chuàng)建。

(3)添加帶有值的四行。

5、在mysql命令提示符下,運行您剛剛創(chuàng)建的腳本。

您將使用以下形式的source命令:

6、在 DBMS 命令提示符處,使用SELECT語句來驗證您是否已成功創(chuàng)建包含數(shù)據(jù)的表。

接下來,您將編寫一些 Go 代碼進行連接,以便進行查詢。

現(xiàn)在你已經(jīng)有了一個包含一些數(shù)據(jù)的數(shù)據(jù)庫,開始你的 Go 代碼。

找到并導入一個數(shù)據(jù)庫驅(qū)動程序,該驅(qū)動程序會將您通過database/sql包中的函數(shù)發(fā)出的請求轉(zhuǎn)換為數(shù)據(jù)庫可以理解的請求。

1、在您的瀏覽器中,訪問SQLDrivers wiki 頁面以識別您可以使用的驅(qū)動程序。

2、使用頁面上的列表來識別您將使用的驅(qū)動程序。為了在本教程中訪問 MySQL,您將使用 Go-MySQL-Driver。

3、請注意驅(qū)動程序的包名稱 - 此處為github.com/go-sql-driver/mysql.

4、使用您的文本編輯器,創(chuàng)建一個用于編寫 Go 代碼的文件,并將該文件作為 main.go 保存在您之前創(chuàng)建的數(shù)據(jù)訪問目錄中。

5、進入main.go,粘貼以下代碼導入驅(qū)動包。

在此代碼中:

(1)將您的代碼添加到main包中,以便您可以獨立執(zhí)行它。

(2)導入 MySQL 驅(qū)動程序github.com/go-sql-driver/mysql。

導入驅(qū)動程序后,您將開始編寫代碼以訪問數(shù)據(jù)庫。

現(xiàn)在編寫一些 Go 代碼,讓您使用數(shù)據(jù)庫句柄訪問數(shù)據(jù)庫。

您將使用指向結(jié)構(gòu)的指針sql.DB,它表示對特定數(shù)據(jù)庫的訪問。

編寫代碼

1、進入 main.go,在import您剛剛添加的代碼下方,粘貼以下 Go 代碼以創(chuàng)建數(shù)據(jù)庫句柄。

在此代碼中:

(3)使用 MySQL 驅(qū)動程序Config和FormatDSN類型以收集連接屬性并將它們格式化為連接字符串的 DSN。

該Config結(jié)構(gòu)使代碼比連接字符串更容易閱讀。

(4)調(diào)用sql.Open 初始化db變量,傳遞 FormatDSN。

(5)檢查來自 的錯誤sql.Open。例如,如果您的數(shù)據(jù)庫連接細節(jié)格式不正確,它可能會失敗。

為了簡化代碼,您調(diào)用log.Fatal結(jié)束執(zhí)行并將錯誤打印到控制臺。在生產(chǎn)代碼中,您會希望以更優(yōu)雅的方式處理錯誤。

(6)調(diào)用DB.Ping以確認連接到數(shù)據(jù)庫有效。在運行時, sql.Open可能不會立即連接,具體取決于驅(qū)動程序。您在Ping此處使用以確認 database/sql包可以在需要時連接。

(7)檢查來自Ping的錯誤,以防連接失敗。

(8)Ping如果連接成功,則打印一條消息。

文件的頂部現(xiàn)在應該如下所示:

3、保存 main.go。

1、開始跟蹤 MySQL 驅(qū)動程序模塊作為依賴項。

使用go get 添加 github.com/go-sql-driver/mysql 模塊作為您自己模塊的依賴項。使用點參數(shù)表示“獲取當前目錄中代碼的依賴項”。

2、在命令提示符下,設置Go 程序使用的DBUSER和DBPASS環(huán)境變量。

在 Linux 或 Mac 上:

在 Windows 上:

3、在包含 main.go 的目錄中的命令行中,通過鍵入go run來運行代碼。

連接成功了!

接下來,您將查詢一些數(shù)據(jù)。

《Go語言程序設計》epub下載在線閱讀全文,求百度網(wǎng)盤云資源

《Go 語言程序設計》(Mark Summerfield)電子書網(wǎng)盤下載免費在線閱讀

資源鏈接:

鏈接:

提取碼: kqzi ?

書名:Go 語言程序設計

作者:Mark Summerfield

譯者:許式偉

豆瓣評分:6.9

出版社:人民郵電出版社

出版年份:2013-8-1

頁數(shù):354

內(nèi)容簡介:

國外最經(jīng)典的Go語言著作,Go語言編程的先驅(qū)者Mark Summerfield的實踐經(jīng)驗總結(jié)。

這是一本Go語言實戰(zhàn)指南,幫你了解Go語言,按Go語言的方式思考,以及使用Go語言來編寫高性能軟件。

作者展示了如何編寫充分利用Go語言突破性的特性和慣用法的代碼,以及Go語言在其他語言之上所做的改進,并著重強調(diào)了Go語言的關(guān)鍵創(chuàng)新。

注重實踐教學,每章都提供了多個經(jīng)過精心設計的代碼示例。

由國內(nèi)第一個核心服務完全采用Go語言實現(xiàn)的團隊——七牛團隊核心成員翻譯。

作者簡介:

Mark Summerfield Qtrac公司創(chuàng)始人,獨立的培訓講師、顧問、技術(shù)編輯,Go、Python、C++、Qt和PyQt方面的技術(shù)作家。他的著作包括Rapid GUI Programming with Python and Qt、C++ GUI Programming with Qt 4(與Jasmin Blanchette合著)、Programming in Python 3和Advanced Qt Programming等。

許式偉——七牛云存儲CEO,開源愛好者,發(fā)布過十余個C++開源項目,擁有超過15年的C/C++開發(fā)經(jīng)驗。

呂桂華——七牛云存儲聯(lián)合創(chuàng)始人,擁有十余年的C/C++大型項目開發(fā)經(jīng)驗,也曾在Java和.NET平臺上探索多年。

徐 立——七牛云存儲首席布道師,前盛大創(chuàng)新院高級研究員。

何李石——七牛云存儲布道師。

七牛云存儲技術(shù)團隊是國內(nèi)第一個核心服務完全采用Go語言實現(xiàn)的團隊。

【golang詳解】go語言GMP(GPM)原理和調(diào)度

Goroutine調(diào)度是一個很復雜的機制,下面嘗試用簡單的語言描述一下Goroutine調(diào)度機制,想要對其有更深入的了解可以去研讀一下源碼。

首先介紹一下GMP什么意思:

G ----------- goroutine: 即Go協(xié)程,每個go關(guān)鍵字都會創(chuàng)建一個協(xié)程。

M ---------- thread內(nèi)核級線程,所有的G都要放在M上才能運行。

P ----------- processor處理器,調(diào)度G到M上,其維護了一個隊列,存儲了所有需要它來調(diào)度的G。

Goroutine 調(diào)度器P和 OS 調(diào)度器是通過 M 結(jié)合起來的,每個 M 都代表了 1 個內(nèi)核線程,OS 調(diào)度器負責把內(nèi)核線程分配到 CPU 的核上執(zhí)行

模型圖:

避免頻繁的創(chuàng)建、銷毀線程,而是對線程的復用。

1)work stealing機制

當本線程無可運行的G時,嘗試從其他線程綁定的P偷取G,而不是銷毀線程。

2)hand off機制

當本線程M0因為G0進行系統(tǒng)調(diào)用阻塞時,線程釋放綁定的P,把P轉(zhuǎn)移給其他空閑的線程執(zhí)行。進而某個空閑的M1獲取P,繼續(xù)執(zhí)行P隊列中剩下的G。而M0由于陷入系統(tǒng)調(diào)用而進被阻塞,M1接替M0的工作,只要P不空閑,就可以保證充分利用CPU。M1的來源有可能是M的緩存池,也可能是新建的。當G0系統(tǒng)調(diào)用結(jié)束后,根據(jù)M0是否能獲取到P,將會將G0做不同的處理:

如果有空閑的P,則獲取一個P,繼續(xù)執(zhí)行G0。

如果沒有空閑的P,則將G0放入全局隊列,等待被其他的P調(diào)度。然后M0將進入緩存池睡眠。

如下圖

GOMAXPROCS設置P的數(shù)量,最多有GOMAXPROCS個線程分布在多個CPU上同時運行

在Go中一個goroutine最多占用CPU 10ms,防止其他goroutine被餓死。

具體可以去看另一篇文章

【Golang詳解】go語言調(diào)度機制 搶占式調(diào)度

當創(chuàng)建一個新的G之后優(yōu)先加入本地隊列,如果本地隊列滿了,會將本地隊列的G移動到全局隊列里面,當M執(zhí)行work stealing從其他P偷不到G時,它可以從全局G隊列獲取G。

協(xié)程經(jīng)歷過程

我們創(chuàng)建一個協(xié)程 go func()經(jīng)歷過程如下圖:

說明:

這里有兩個存儲G的隊列,一個是局部調(diào)度器P的本地隊列、一個是全局G隊列。新創(chuàng)建的G會先保存在P的本地隊列中,如果P的本地隊列已經(jīng)滿了就會保存在全局的隊列中;處理器本地隊列是一個使用數(shù)組構(gòu)成的環(huán)形鏈表,它最多可以存儲 256 個待執(zhí)行任務。

G只能運行在M中,一個M必須持有一個P,M與P是1:1的關(guān)系。M會從P的本地隊列彈出一個可執(zhí)行狀態(tài)的G來執(zhí)行,如果P的本地隊列為空,就會想其他的MP組合偷取一個可執(zhí)行的G來執(zhí)行;

一個M調(diào)度G執(zhí)行的過程是一個循環(huán)機制;會一直從本地隊列或全局隊列中獲取G

上面說到P的個數(shù)默認等于CPU核數(shù),每個M必須持有一個P才可以執(zhí)行G,一般情況下M的個數(shù)會略大于P的個數(shù),這多出來的M將會在G產(chǎn)生系統(tǒng)調(diào)用時發(fā)揮作用。類似線程池,Go也提供一個M的池子,需要時從池子中獲取,用完放回池子,不夠用時就再創(chuàng)建一個。

work-stealing調(diào)度算法:當M執(zhí)行完了當前P的本地隊列隊列里的所有G后,P也不會就這么在那躺尸啥都不干,它會先嘗試從全局隊列隊列尋找G來執(zhí)行,如果全局隊列為空,它會隨機挑選另外一個P,從它的隊列里中拿走一半的G到自己的隊列中執(zhí)行。

如果一切正常,調(diào)度器會以上述的那種方式順暢地運行,但這個世界沒這么美好,總有意外發(fā)生,以下分析goroutine在兩種例外情況下的行為。

Go runtime會在下面的goroutine被阻塞的情況下運行另外一個goroutine:

用戶態(tài)阻塞/喚醒

當goroutine因為channel操作或者network I/O而阻塞時(實際上golang已經(jīng)用netpoller實現(xiàn)了goroutine網(wǎng)絡I/O阻塞不會導致M被阻塞,僅阻塞G,這里僅僅是舉個栗子),對應的G會被放置到某個wait隊列(如channel的waitq),該G的狀態(tài)由_Gruning變?yōu)開Gwaitting,而M會跳過該G嘗試獲取并執(zhí)行下一個G,如果此時沒有可運行的G供M運行,那么M將解綁P,并進入sleep狀態(tài);當阻塞的G被另一端的G2喚醒時(比如channel的可讀/寫通知),G被標記為,嘗試加入G2所在P的runnext(runnext是線程下一個需要執(zhí)行的 Goroutine。), 然后再是P的本地隊列和全局隊列。

系統(tǒng)調(diào)用阻塞

當M執(zhí)行某一個G時候如果發(fā)生了阻塞操作,M會阻塞,如果當前有一些G在執(zhí)行,調(diào)度器會把這個線程M從P中摘除,然后再創(chuàng)建一個新的操作系統(tǒng)的線程(如果有空閑的線程可用就復用空閑線程)來服務于這個P。當M系統(tǒng)調(diào)用結(jié)束時候,這個G會嘗試獲取一個空閑的P執(zhí)行,并放入到這個P的本地隊列。如果獲取不到P,那么這個線程M變成休眠狀態(tài), 加入到空閑線程中,然后這個G會被放入全局隊列中。

隊列輪轉(zhuǎn)

可見每個P維護著一個包含G的隊列,不考慮G進入系統(tǒng)調(diào)用或IO操作的情況下,P周期性的將G調(diào)度到M中執(zhí)行,執(zhí)行一小段時間,將上下文保存下來,然后將G放到隊列尾部,然后從隊列中重新取出一個G進行調(diào)度。

除了每個P維護的G隊列以外,還有一個全局的隊列,每個P會周期性地查看全局隊列中是否有G待運行并將其調(diào)度到M中執(zhí)行,全局隊列中G的來源,主要有從系統(tǒng)調(diào)用中恢復的G。之所以P會周期性地查看全局隊列,也是為了防止全局隊列中的G被餓死。

除了每個P維護的G隊列以外,還有一個全局的隊列,每個P會周期性地查看全局隊列中是否有G待運行并將其調(diào)度到M中執(zhí)行,全局隊列中G的來源,主要有從系統(tǒng)調(diào)用中恢復的G。之所以P會周期性地查看全局隊列,也是為了防止全局隊列中的G被餓死。

M0

M0是啟動程序后的編號為0的主線程,這個M對應的實例會在全局變量rutime.m0中,不需要在heap上分配,M0負責執(zhí)行初始化操作和啟動第一個G,在之后M0就和其他的M一樣了

G0

G0是每次啟動一個M都會第一個創(chuàng)建的goroutine,G0僅用于負責調(diào)度G,G0不指向任何可執(zhí)行的函數(shù),每個M都會有一個自己的G0,在調(diào)度或系統(tǒng)調(diào)用時會使用G0的棧空間,全局變量的G0是M0的G0

一個G由于調(diào)度被中斷,此后如何恢復?

中斷的時候?qū)⒓拇嫫骼锏臈P畔ⅲ4娴阶约旱腉對象里面。當再次輪到自己執(zhí)行時,將自己保存的棧信息復制到寄存器里面,這樣就接著上次之后運行了。

我這里只是根據(jù)自己的理解進行了簡單的介紹,想要詳細了解有關(guān)GMP的底層原理可以去看Go調(diào)度器 G-P-M 模型的設計者的文檔或直接看源碼

參考: ()

()

網(wǎng)站名稱:go語言42章,go語言實戰(zhàn)筆記
分享路徑:http://chinadenli.net/article5/dseoooi.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)微信公眾號企業(yè)建站用戶體驗全網(wǎng)營銷推廣網(wǎng)站設計公司

廣告

聲明:本網(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)化