1. 程式人生 > 其它 >自動推送訊息後臺

自動推送訊息後臺

簡介:

是一個定時給教師推送教務資訊的後臺程式,定時推送功能由Go的cron庫來實現,定時呼叫自己寫的teacher_noti方法,並且對外開放介面,可以在外面實現推送內容的增刪改查。

學到的新技術:

  1. 第一次瞭解到crontab和接觸到cron庫,掌握了crontab的定時表示式

    crontab.AddFunc("* * * * *", test) //五個*號分別表示分,時,天,月,星期

    AddFunc方法具有侷限性,傳入的方法不能帶有引數,如果一定要帶引數可以用AddJob方法

    crontab.AddJob("* * * * *", Job{})  //Job是一個實現了Run方法的類
  2. 獲取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
    }
  3. 返回資料給前端時要注意格式,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
    }

低階錯誤:

  1. 在使用反射方法糾錯時沒有寫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+"未填寫或有誤")
    }
    }
  2. 專案中很多地方糾錯就用了log列印一下,沒有給前端返回訊息或者及時return

  3. 重複連線資料,只要設定全域性變數,然後在main方法中連線一次即可

  4. 顏色要用美式英語color

理解錯誤:

  1. 資料庫表建多餘了,對錶功能的理解不夠,下次建表前要想想清楚(及時問leader)

  2. 在統計成功傳送數量時,想到的是往傳送方法中傳入一個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)

介面中有一些方法,只要某結構體實現了該介面中的所有方法,該結構體的實體就能作為已該介面為入參的入參