本教程介紹了使用 Godatabase/sql及其標(biāo)準(zhǔn)庫(kù)中的包訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)。
創(chuàng)新互聯(lián)建站是專業(yè)的類烏齊網(wǎng)站建設(shè)公司,類烏齊接單;提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行類烏齊網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
您將使用的database/sql包包括用于連接數(shù)據(jù)庫(kù)、執(zhí)行事務(wù)、取消正在進(jìn)行的操作等的類型和函數(shù)。
在本教程中,您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),然后編寫代碼來(lái)訪問(wèn)該數(shù)據(jù)庫(kù)。您的示例項(xiàng)目將是有關(guān)老式爵士樂(lè)唱片的數(shù)據(jù)存儲(chǔ)庫(kù)。
首先,為您要編寫的代碼創(chuàng)建一個(gè)文件夾。
1、打開(kāi)命令提示符并切換到您的主目錄。
在 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í)際開(kāi)發(fā)中,您會(huì)指定一個(gè)更符合您自己需求的模塊路徑。有關(guān)更多信息,請(qǐng)參閱一下文章。
GO語(yǔ)言(二十五):管理依賴項(xiàng)(上)
GO語(yǔ)言(二十六):管理依賴項(xiàng)(中)
GO語(yǔ)言(二十七):管理依賴項(xiàng)(下)
接下來(lái),您將創(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)黑膠唱片上的老式爵士樂(lè)錄音的數(shù)據(jù)。
這里的代碼使用MySQL CLI,但大多數(shù) DBMS 都有自己的 CLI,具有類似的功能。
1、打開(kāi)一個(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 的文件來(lái)保存用于添加表的 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ǔ)句來(lái)驗(yàn)證您是否已成功創(chuàng)建包含數(shù)據(jù)的表。
接下來(lái),您將編寫一些 Go 代碼進(jìn)行連接,以便進(jìn)行查詢。
現(xiàn)在你已經(jīng)有了一個(gè)包含一些數(shù)據(jù)的數(shù)據(jù)庫(kù),開(kāi)始你的 Go 代碼。
找到并導(dǎo)入一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,該驅(qū)動(dòng)程序會(huì)將您通過(guò)database/sql包中的函數(shù)發(fā)出的請(qǐng)求轉(zhuǎn)換為數(shù)據(jù)庫(kù)可以理解的請(qǐng)求。
1、在您的瀏覽器中,訪問(wèn)SQLDrivers wiki 頁(yè)面以識(shí)別您可以使用的驅(qū)動(dòng)程序。
2、使用頁(yè)面上的列表來(lái)識(shí)別您將使用的驅(qū)動(dòng)程序。為了在本教程中訪問(wèn) 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ù)訪問(wèn)目錄中。
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)程序后,您將開(kāi)始編寫代碼以訪問(wèn)數(shù)據(jù)庫(kù)。
現(xiàn)在編寫一些 Go 代碼,讓您使用數(shù)據(jù)庫(kù)句柄訪問(wèn)數(shù)據(jù)庫(kù)。
您將使用指向結(jié)構(gòu)的指針sql.DB,它表示對(duì)特定數(shù)據(jù)庫(kù)的訪問(wèn)。
編寫代碼
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)檢查來(lái)自 的錯(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)檢查來(lái)自Ping的錯(cuò)誤,以防連接失敗。
(8)Ping如果連接成功,則打印一條消息。
文件的頂部現(xiàn)在應(yīng)該如下所示:
3、保存 main.go。
1、開(kāi)始跟蹤 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 的目錄中的命令行中,通過(guò)鍵入go run來(lái)運(yùn)行代碼。
連接成功了!
接下來(lái),您將查詢一些數(shù)據(jù)。
這個(gè)似乎不是那么容易解答的,首先你要把數(shù)據(jù)從mongodb查出來(lái),你要確保已經(jīng)安裝了go語(yǔ)言的mongodb驅(qū)動(dòng)。然后對(duì)查出來(lái)的數(shù)據(jù)進(jìn)行解析,查出來(lái)的數(shù)據(jù)是類似json的數(shù)據(jù),這個(gè)解析代碼需要相關(guān)的庫(kù)或者你自己寫的。然后再把數(shù)據(jù)相應(yīng)的插入mysql里,這里你也要安裝go語(yǔ)言的mysql驅(qū)動(dòng)和odbc
取進(jìn)程信息 要使用應(yīng)用接口支持庫(kù) 或者用API 我給你貼個(gè)例子 你可以加我QQ我給你源碼.
源碼中需要超級(jí)列表框的支持.
.版本 2
.支持庫(kù) eAPI
.支持庫(kù) iext
.局部變量 進(jìn)程組, 進(jìn)程信息, , "0"
.局部變量 局部計(jì)次, 整數(shù)型
超級(jí)列表框1.全部刪除 ()
進(jìn)程組 = 取系統(tǒng)進(jìn)程列表 ()
.計(jì)次循環(huán)首 (取數(shù)組下標(biāo) (進(jìn)程組, ), 局部計(jì)次)
超級(jí)列表框1.插入表項(xiàng) (, , , , , )
超級(jí)列表框1.置標(biāo)題 (局部計(jì)次 - 1, 0, 到文本 (進(jìn)程組 [局部計(jì)次].進(jìn)程標(biāo)識(shí)符))
超級(jí)列表框1.置標(biāo)題 (局部計(jì)次 - 1, 1, 到文本 (進(jìn)程組 [局部計(jì)次].進(jìn)程名稱))
超級(jí)列表框1.置標(biāo)題 (局部計(jì)次 - 1, 2, 到文本 (進(jìn)程組 [局部計(jì)次].父進(jìn)程標(biāo)識(shí)符))
超級(jí)列表框1.置標(biāo)題 (局部計(jì)次 - 1, 3, 到文本 (進(jìn)程組 [局部計(jì)次].線程數(shù)))
.計(jì)次循環(huán)尾 ()
一般來(lái)說(shuō),進(jìn)程的操作使用的是一些系統(tǒng)的命令,所以go內(nèi)部使用os包,進(jìn)行一些運(yùn)行系統(tǒng)命令的操作
os 包及其子包 os/exec 提供了創(chuàng)建進(jìn)程的方法。
一般的,應(yīng)該優(yōu)先使用 os/exec 包。因?yàn)?os/exec 包依賴 os 包中關(guān)鍵創(chuàng)建進(jìn)程的 API,為了便于理解,我們先探討 os 包中和進(jìn)程相關(guān)的部分。
Unix :fork創(chuàng)建一個(gè)進(jìn)程,(及其一些變種,如 vfork、clone)。
Go:Linux 下創(chuàng)建進(jìn)程使用的系統(tǒng)調(diào)用是 clone。
允許一進(jìn)程(父進(jìn)程)創(chuàng)建一新進(jìn)程(子進(jìn)程)。具體做法是,新的子進(jìn)程幾近于對(duì)父進(jìn)程的翻版:子進(jìn)程獲得父進(jìn)程的棧、數(shù)據(jù)段、堆和執(zhí)行文本段的拷貝。可將此視為把父進(jìn)程一分為二。
終止一進(jìn)程,將進(jìn)程占用的所有資源(內(nèi)存、文件描述符等)歸還內(nèi)核,交其進(jìn)行再次分配。參數(shù) status 為一整型變量,表示進(jìn)程的退出狀態(tài)。父進(jìn)程可使用系統(tǒng)調(diào)用 wait() 來(lái)獲取該狀態(tài)。
目的有二:其一,如果子進(jìn)程尚未調(diào)用 exit() 終止,那么 wait 會(huì)掛起父進(jìn)程直至子進(jìn)程終止;其二,子進(jìn)程的終止?fàn)顟B(tài)通過(guò) wait 的 status 參數(shù)返回。
加載一個(gè)新程序(路徑名為 pathname,參數(shù)列表為 argv,環(huán)境變量列表為 envp)到當(dāng)前進(jìn)程的內(nèi)存。這將丟棄現(xiàn)存的程序文本段,并為新程序重新創(chuàng)建棧、數(shù)據(jù)段以及堆。通常將這一動(dòng)作稱為執(zhí)行一個(gè)新程序。
沒(méi)有直接提供 fork 系統(tǒng)調(diào)用的封裝,而是將 fork 和 execve 合二為一,提供了 syscall.ForkExec。如果想只調(diào)用 fork,得自己通過(guò) syscall.Syscall(syscall.SYS_FORK, 0, 0, 0) 實(shí)現(xiàn)。
os.Process 存儲(chǔ)了通過(guò) StartProcess 創(chuàng)建的進(jìn)程的相關(guān)信息。
一般通過(guò) StartProcess 創(chuàng)建 Process 的實(shí)例,函數(shù)聲明如下:
它使用提供的程序名、命令行參數(shù)、屬性開(kāi)始一個(gè)新進(jìn)程。StartProcess 是一個(gè)低級(jí)別的接口。os/exec 包提供了高級(jí)別的接口,一般應(yīng)該盡量使用 os/exec 包。如果出錯(cuò),錯(cuò)誤的類型會(huì)是 *PathError。
屬性定義如下:
FindProcess 可以通過(guò) pid 查找一個(gè)運(yùn)行中的進(jìn)程。該函數(shù)返回的 Process 對(duì)象可以用于獲取關(guān)于底層操作系統(tǒng)進(jìn)程的信息。在 Unix 系統(tǒng)中,此函數(shù)總是成功,即使 pid 對(duì)應(yīng)的進(jìn)程不存在。
Process 提供了四個(gè)方法:Kill、Signal、Wait 和 Release。其中 Kill 和 Signal 跟信號(hào)相關(guān),而 Kill 實(shí)際上就是調(diào)用 Signal,發(fā)送了 SIGKILL 信號(hào),強(qiáng)制進(jìn)程退出,關(guān)于信號(hào),后續(xù)章節(jié)會(huì)專門講解。
Release 方法用于釋放 Process 對(duì)象相關(guān)的資源,以便將來(lái)可以被再使用。該方法只有在確定沒(méi)有調(diào)用 Wait 時(shí)才需要調(diào)用。Unix 中,該方法的內(nèi)部實(shí)現(xiàn)只是將 Process 的 pid 置為 -1。
通過(guò) os 包可以做到運(yùn)行外部命令,如前面的例子。不過(guò),Go 標(biāo)準(zhǔn)庫(kù)為我們封裝了更好用的包: os/exec,運(yùn)行外部命令,應(yīng)該優(yōu)先使用它,它包裝了 os.StartProcess 函數(shù)以便更容易的重定向標(biāo)準(zhǔn)輸入和輸出,使用管道連接 I/O,以及作其它的一些調(diào)整。
exec.LookPath 函數(shù)在 PATH 指定目錄中搜索可執(zhí)行程序,如 file 中有 /,則只在當(dāng)前目錄搜索。該函數(shù)返回完整路徑或相對(duì)于當(dāng)前路徑的一個(gè)相對(duì)路徑。
func LookPath(file string) (string, error)
如果在 PATH 中沒(méi)有找到可執(zhí)行文件,則返回 exec.ErrNotFound。
Cmd 結(jié)構(gòu)代表一個(gè)正在準(zhǔn)備或者在執(zhí)行中的外部命令,調(diào)用了 Run、Output 或 CombinedOutput 后,Cmd 實(shí)例不能被重用。
一般的,應(yīng)該通過(guò) exec.Command 函數(shù)產(chǎn)生 Cmd 實(shí)例:
用法
得到 * Cmd 實(shí)例后,接下來(lái)一般有兩種寫法:
前面講到,通過(guò) Cmd 實(shí)例后,有兩種方式運(yùn)行命令。有時(shí)候,我們不只是簡(jiǎn)單的運(yùn)行命令,還希望能控制命令的輸入和輸出。通過(guò)上面的 API 介紹,控制輸入輸出有幾種方法:
參考資料:
CreateToolhelp32Snapshot法:
// //////////////////////////////////////////////////////////////////////////
// // CreateToolhelp32Snapshot 法 ? ? ? ? ? ?#include Tlhelp32.h
// //////////////////////////////////////////////////////////////////////////
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet;
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
bRet = Process32First(hProcessSnap,pe32);
while (bRet)
{
bRet = Process32Next(hProcessSnap,pe32);
printf("%s\n",pe32.szExeFile);
}
return 0;
如果想輸出文件路徑,在其中加入提權(quán)代碼后再OpenProcess,GetModuleFileNameEx即可。
EnumProcesses 法
//////////////////////////////////////////////////////////////////////////
// EnumProcesses 法 ? ? ?#include Psapi.h ? #pragma comment(lib,"Psapi.lib")
//////////////////////////////////////////////////////////////////////////
DWORD PID[1024];
DWORD needed,NumProcess;
EnumProcesses(PID,sizeof(PID),needed);
NumProcess = needed/sizeof(DWORD);
char FilePatch[MAX_PATH];
for (DWORD i=0;iNumProcess;i++)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,PID[i]);
if (hProcess)
{
GetModuleFileNameEx(hProcess,NULL,FilePatch,sizeof(FilePatch));
printf("%s\n",FilePatch);
}
}
CloseHandle(hProcess);
printf("一共%d個(gè)進(jìn)程\n",NumProcess);
return 0;
WTSOpenServer 法
//////////////////////////////////////////////////////////////////////////
// WTSOpenServer 法 ? #include Wtsapi32.h #pragma comment(lib,"Wtsapi32.lib") ? 用nbtstat -an獲取本機(jī)NetBios名稱,并在命令行下輸入即可
//////////////////////////////////////////////////////////////////////////
char *szServerName = argv[1];
PWTS_PROCESS_INFO wts;
DWORD dwCount;
HANDLE hWtsServer = WTSOpenServer(szServerName);
if(!WTSEnumerateProcesses(hWtsServer,0,1,wts,dwCount))
return 0;
for (DWORD i=0;idwCount;i++)
{
printf("%s\n",wts[i].pProcessName);?
}
return 0;
Docker 提供了一個(gè)與 Docker 守護(hù)進(jìn)程交互的 API (稱為Docker Engine API),我們可以使用官方提供的 Go 語(yǔ)言的 SDK 進(jìn)行構(gòu)建和擴(kuò)展 Docker 應(yīng)用程序和解決方案。
轉(zhuǎn)自:
整理:地鼠文檔
通過(guò)下面的命令就可以安裝 SDK 了:
該部分會(huì)介紹如何使用 Golang + Docker API 進(jìn)行管理本地的 Docker。
第一個(gè)例子將展示如何運(yùn)行容器,相當(dāng)于 docker run docker.io/library/alpine echo "hello world" :
還可以在后臺(tái)運(yùn)行容器,相當(dāng)于 docker run -d bfirsh/reticulate-splines :
列出正在運(yùn)行的容器,就像使用 docker ps 一樣:
如果是 docker ps -a ,我們可以通過(guò)修改 types.ContainerListOptions 中的 All 屬性達(dá)到這個(gè)目的:
通過(guò)上面的例子,我們可以獲取容器的列表,所以在這個(gè)案例中,我們可以去停止所有正在運(yùn)行的容器。
通過(guò)指定容器的 ID,我們可以獲取對(duì)應(yīng) ID 的容器的日志:
獲取本地所有的鏡像,相當(dāng)于 docker image ls 或 docker images :
拉取指定鏡像,相當(dāng)于 docker pull alpine :
除了公開(kāi)的鏡像,我們平時(shí)還會(huì)用到一些私有鏡像,可以是 DockerHub 上私有鏡像,也可以是自托管的鏡像倉(cāng)庫(kù),比如 harbor 。這個(gè)時(shí)候,我們需要提供對(duì)應(yīng)的憑證才可以拉取鏡像。
值得注意的是:在使用 Docker API 的 Go SDK 時(shí),憑證是以明文的方式進(jìn)行傳輸?shù)?,所以如果是自建的鏡像倉(cāng)庫(kù),請(qǐng)務(wù)必使用 HTTPS !
我們可以將一個(gè)已有的容器通過(guò) commit 保存成一個(gè)鏡像:
當(dāng)然,除了可以管理本地的 Docker , 我們同樣也可以通過(guò)使用 Golang + Docker API 管理遠(yuǎn)程的 Docker 。
默認(rèn) Docker 是通過(guò)非網(wǎng)絡(luò)的 Unix 套接字運(yùn)行的,只能夠進(jìn)行本地通信( /var/run/docker.sock ),是不能夠直接遠(yuǎn)程連接 Docker 的。
我們需要編輯配置文件 /etc/docker/daemon.json ,并修改以下內(nèi)容(把 192.168.59.3 改成你自己的 IP 地址),然后重啟 Docker :
創(chuàng)建 client 的時(shí)候需要指定遠(yuǎn)程 Docker 的地址,這樣就可以像管理本地 Docker 一樣管理遠(yuǎn)程的 Docker 了:
現(xiàn)在已經(jīng)有很多可以管理 Docker 的產(chǎn)品,它們便是這樣進(jìn)行實(shí)現(xiàn)的,比如: portainer 。