自動推送訊息後臺
阿新 • • 發佈:2021-12-15
簡介:
是一個定時給教師推送教務資訊的後臺程式,定時推送功能由Go的cron庫來實現,定時呼叫自己寫的teacher_noti方法,並且對外開放介面,可以在外面實現推送內容的增刪改查。
學到的新技術:
-
第一次瞭解到crontab和接觸到cron庫,掌握了crontab的定時表示式
crontab.AddFunc("* * * * *", test) //五個*號分別表示分,時,天,月,星期
AddFunc方法具有侷限性,傳入的方法不能帶有引數,如果一定要帶引數可以用AddJob方法
crontab.AddJob("* * * * *", Job{}) //Job是一個實現了Run方法的類
-
獲取id、狀態等int型別的資料時,最好在外面封裝一層
state := ParseIntDefault(c.PostForm("state"), 0)
func ParseIntDefault(s string, d int) int {
if a, err := strconv.Atoi(s); err == nil {
return a
}
return d
} -
返回資料給前端時要注意格式,int型別要轉string,time型別要format,還要做好資料可能為空的處理。這裡最好寫個Assemble方法(用介面實現多型),要傳入指標資料型別
// Assembler 將 model 組裝成 map
type Assembler interface {
Assemble() map[string]interface{}
}
// StructToMap 返回 map
func StructToMap(a Assembler) map[string]interface{} {
return a.Assemble()
}
func (item *NotiForm) Assemble() map[string]interface{} {
data := map[string]interface{}{}
data["noti_id"] = strconv.Itoa(item.ID)
//...
//使用ParseIntDefault方法後,若傳入資料無效會自動校正為0
if item.End.IsZero() {
data["end"] = ""
} else {
data["end"] = item.End.In(cstlocGlobal).Format("2006-01-02 15:04:05")
}
return data
}
-
在使用反射方法糾錯時沒有寫errname
errStrings := []string{}
t := reflect.TypeOf(notiForm)
for i := 0; i < t.NumField(); i++ {
if strings.Contains(err.Error(), t.Field(i).Name) {
errname := t.Field(i).Tag.Get("errname")
errStrings = append(errStrings, errname+"未填寫或有誤")
}
} -
專案中很多地方糾錯就用了log列印一下,沒有給前端返回訊息或者及時return
-
重複連線資料,只要設定全域性變數,然後在main方法中連線一次即可
-
顏色要用美式英語color
理解錯誤:
-
資料庫表建多餘了,對錶功能的理解不夠,下次建表前要想想清楚(及時問leader)
-
在統計成功傳送數量時,想到的是往傳送方法中傳入一個int遍歷的指標,每次成功傳送後都++。後改為給該方法新增一個bool返回值,外層使用for循壞判斷++
對Go語言介面實現多型的理解:
go語言使用struct和interface實現多型
type Cat struct{
Name string
}
type Dog struct{
Name string
}
//1. 建立一個介面,指定要實現的方法
type animaler interface {
eat()
sleep()
}
//2. 實現介面中的方法 (要將介面中的方法全部實現)
func (cat Cat) eat() {
fmt.Println(cat.Name,"eat")
}
func (cat Cat) sleep() {
fmt.Println(cat.Name,"sleep")
}
func (dog Dog) eat() {
fmt.Println(dog.Name,"eat")
}
func (dog Dog) sleep() {
fmt.Println(dog.Name,"sleep")
}
//3. 建立一個方法傳入介面
func TestInterface(a animaler) {
a.eat()
a.sleep()
}
//4. 使用時呼叫方法TestInterface()
var cat Cat
cat.Name = "mimi"
var dog Dog
dog.Name = "wangwang"
TestInterface(cat) //定義時入參時為animaler型別,呼叫時入參為實現了介面方法的實體類型別
TestInterface(dog)
介面中有一些方法,只要某結構體實現了該介面中的所有方法,該結構體的實體就能作為已該介面為入參