使用Golang lua實現乙個值班機械人

2022-01-29 14:23:12 字數 2183 閱讀 8607

我們在的專案組呢,有一項工作是,收郵件(很大程度上使用郵件是為了存個底),然後從我們的系統裡邊查一下相關資訊,然後回覆個郵件的工作。雖然工作量並不大,但是會把時間切的稀碎。為了拯救我的時間,所以做了乙個郵件的值班機械人。讓他來頂替我自動回覆郵件,考慮到這個東西應該也有不少人會用得到,所以就把這個東西分享出來。先把效果分享出來。

伺服器上就很簡單,dutyrobot就是golang編譯之後的框架。lua資料夾中就是使用lua編寫的業務邏輯。data.json就是儲存了一些相關的資料,防止重啟之後,資料丟掉,比如說cookie資訊。

用最基礎的alpine進行啟動一下,並且將相關的資料夾對映到容器裡邊,然後在容器裡邊啟動軟體。這麼做主要是為了讓映象能夠擁有自己的環境變數。

然後業務邏輯裡邊定期,收郵件,然後判定業務邏輯,執行對應的lua指令碼,然後回覆郵件。

在順手往我們的內部事務群裡邊推一條相關結果。

其實我本職是c#程式設計師來著,做這個東西,最先也是使用c#來實現的,不過c#跟lua相性不好,我沒有找到比較優雅的類庫。要上linux系統,用.net core + c 呼叫lua的方式雖然也嘗試過,但是我本身對這件事情還是非常虛的。python的各種包安裝都給我搞蒙蔽了。所以最後就選用了golang來寫底層函式公布給lua,然後讓lua來寫各種業務邏輯的方式來實現整個專案。框架部分嘛,一旦寫完,改動的機率還是比較低的,並且window交叉編譯linux,直接就可以部署上線,連個環境都不用裝,簡直爽歪歪。lua解釋性語言,出了啥都沒有以外其他的都挺好的。

基礎框架都是通用的,所以可以直接放出來,拿出來用。只需要關心自己的業務內容就可以了。

基礎框架:

在這個框架裡邊,我給lua提供了不少功能,主要包括收發郵件,發起網路請求,發起網路監聽(甚至可以拿這個做底層做乙個小型的api站,信我,我這麼做過了已經),臨時存個資料,獲取環境變數,獲取檔案內容,再啟動乙個lua容器(沒錯,lua又再起乙個lua容器的能力),獲取當前系統資訊,cron定時任務。當然如果你覺得不夠的話,還可以進行二次擴充套件,其實非常容易,我已經寫了好多了,比著抄一下,很容易的。不過一般情況下不用擴充套件了,我這邊就不深入講解框架部分了,畢竟,怎麼做業務才是重點。

然後,講一下lua部分是怎麼實現的。因為golang裡邊的**是直接找到了main.lua進行執行的,我們也就從這個檔案開始講起。

我將好多服務註冊了進來,究竟有哪些服務呢,還是得去看看框架裡邊怎麼寫的。cron就是我寫的其中乙個小功能。其實就是task任務,對應到框架部分呢可以檢視tasks資料夾裡去看具體的實現,可以看到倆邊有兩個檔案,其中task.go是golang的語言函式task_4lua.go就是把golang的函式公開給lua來呼叫的介面註冊的位置。

我們來看到task_4lua.go這個檔案裡邊,一般會存在乙個函式叫做registerfunc_4lua就是註冊用的。

這就很眼熟了,cron就是lua用的類的名字,下邊這個map就是他們對應的需要呼叫的名字,後邊會對照著golang這邊的函式,一般函式裡邊我會寫上lua那邊應該怎麼呼叫。如果找不到的話,可以來框架這邊翻一翻,有驚喜也說不定。

我的業務裡邊。就是每分鐘接收一下,每5分鐘儲存一下cookie。真正的業務邏輯其實就寫在各個lua檔案裡邊。我們去看一下怎麼接收訊息和處理訊息的。

這裡邊就是簡單的lua的業務邏輯了,收一下郵件,然後呼叫對應的處理lua,處理完了就完事了。

使用兩個佇列實現乙個棧,使用兩個棧實現乙個佇列

一 棧與佇列的特點 一 棧 棧 一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行資料插入和刪除操作的一端稱為棧頂,另一端稱為棧底。不含任何元素的棧稱為空 棧,棧又稱為後進先出的線性表。棧的特點 後進先出 lifo 二 佇列 佇列 只允許在一端進行插入資料操作,在另一端進行刪除資料操...

如何使用乙個陣列實現乙個佇列呢?

下文是筆者講述使用陣列實現佇列效果的方法分享,如下所示 實現思路 設定乙個startindex和curindex及size三個變數,即可使用陣列實現乙個佇列效果,如下所示 package com.j a265.algorithm 使用陣列實現乙個佇列效果,佇列先進先出 public class ar...

使用乙個節點實現環形Queue

用環形鍊錶實現queue。環形表也是一條鍊錶,只是沒有任何節點的鏈結為空,且只要鍊錶非空則last.next的值為first。只能使用乙個node型別的例項變數 last public class recyclequeue public recyclequeue item item void enq...