time.NewTimer 触发一次
time.NewTicker 循环触发

time.Tick 是 time.NewTicker 的简化版,适合整个程序生命周期都需要的情况,因为它无法关闭会造成泄漏。

package main

import (
    "time"
)

func main() {
    timer := time.NewTimer(time.Second * 5)
    // 等待定时器超时
    <-timer.C
    // 关闭定时器
    timer.Stop()
    
    // 永远等待
    select {}
}

package main

import (
    "fmt"

    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 密钥
    mySigningKey := []byte("AllYourBase")

    // 签发,ss就是签名过的token,客户端请求附带这个token就可以了
    ss := func() string {
        claims := &jwt.StandardClaims{
            Subject: "wameidemao",
        }
        token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
        ss, _ := token.SignedString(mySigningKey)
        return ss
    }()
    fmt.Println(ss)

    // 验证
    token := func(ss string) *jwt.Token {
        claims := &jwt.StandardClaims{}
        token, _ := jwt.ParseWithClaims(ss, claims, func(token *jwt.Token) (interface{}, error) {
            // 在这里可以根据不同用户获取不同的签名key
            claims := token.Claims.(*jwt.StandardClaims)
            fmt.Printf("用户 %s 获取密钥\n", claims.Subject)
            return mySigningKey, nil
        })
        return token
    }(ss)
    // 校验成功为true
    fmt.Println(token.Valid)
}

package main

import (
    "fmt"
    "net"
)

func main() {
    // udp组播
    addr, _ := net.ResolveUDPAddr("udp", "224.0.0.50:9898")
    conn, _ := net.ListenMulticastUDP("udp", nil, addr)

    for {
        data := make([]byte, 512)
        conn.ReadFromUDP(data)
        fmt.Println(string(data))
    }
}

{"cmd":"heartbeat","model":"gateway","sid":"7811dcb3a923","short_id":"0","token":"v2u3sR8DprP3M7r1","data":"{\"ip\":\"192.168.31.132\"}"}

安装 statik

go get -d github.com/rakyll/statik

打包

statik -src=assets

package main

// 这个命令是用来打包资源文件的,使用命令 go generate 执行
//go:generate statik -src=assets

import (
    "net/http"

    "github.com/rakyll/statik/fs"
    _ "xxx/statik"
)

func main() {

    // !! 注意 !!
    // http.StripPrefix 是用来剥离 URL 前缀地址的,不然传入 http.FileServer 会导致路径错误。
    // http.Handle("/assets/") 这里必须以 / 结尾,否则无法访问到文件夹下的内容。

    // 从包中访问
    statikfs, _ := fs.New()
    http.Handle("/assets/", http.StripPrefix("/assets", http.FileServer(statikfs)))

    // 从本地访问
    // http.Handle("/assets/", http.StripPrefix("/assets", http.FileServer(http.Dir("assets"))))

    http.ListenAndServe(":8000", nil)
}

参考资料:
https://blog.fatedier.com/2016/08/01/compile-assets-into-binary-file-with-statik-in-golang/