命令记不住

登陆

服务端数据内存存储

服务端数据内存存储

在Go语言中若要将相关的数据信息存储在内存中,可以使用数组、切片、映射和结构等数据结构的方式实现

服务端基于内存的存储方式实践

将用户信息存储在内存中,并增加一个接口,返回指定用户名的用户信息.

var UserById = make(map[int]*User)
var UserByName = make(mapstring*User)

定义全局变量,分别用来存储Id-User与Nmae-User的映射,UserById会将帖子的唯一Id映射至全指向帖子的指针,而UserByName则会将用户名映射至一个切片,这个切片可以包含多个指向用户的指针。这两个变量映射指向User的指针,因此可以确保无论是通过哪种方式来获取User信息,得到的都是相同的User,而不是同一User的不同副本。store方法用于存储用户信息。获取用户信息时,根据指定的用户名,返回对应的用户信息。

package main

import (
    "fmt"
    "html/template"
    "log"
    "net/http"
)

type User struct {
    Id       int
    Name     string
    Password string
}

var UserById = make(map[int]*User)
var UserByName = make(map[string][]*User)

var tpl = `<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" value="登录">
</form>
</body>
</html>`

func loginMemory(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method:", r.Method) //获取请求的方法
    if r.Method == "GET" {
        var t *template.Template
        t = template.New("Products") //创建一个模板
        t, _ = t.Parse(tpl)
        log.Println(t.Execute(w, nil))
    } else {
        //请求的是登录数据,那么执行登录的逻辑判断
        _ = r.ParseForm()
        fmt.Println("username:", r.Form["username"])
        fmt.Println("password:", r.Form["password"])
        user1 := User{1, r.Form.Get("username"), r.Form.Get("password")}
        store(user1)
        if pwd := r.Form.Get("password"); pwd == "123456" { // 验证密码是否正确
            fmt.Fprintf(w, "欢迎登陆,Hello %s!", r.Form.Get("username")) //这个写入到w的是输出到客户端的
        } else {
            fmt.Fprintf(w, "密码错误,请重新输入!")
        }
    }
}

func store(user User) {
    UserById[user.Id] = &user
    UserByName[user.Name] = append(UserByName[user.Name], &user)
}
func userInfo(w http.ResponseWriter, r *http.Request) {
    fmt.Println(UserById[1])
    r.ParseForm()

    for _, user := range UserByName[r.Form.Get("username")] {
        fmt.Println(user)
        fmt.Fprintf(w, " %v", user) //这个写入到w的是输出到客户端的
    }
}

func main() {

    http.HandleFunc("/login", loginMemory)   //设置访问的路由
    http.HandleFunc("/info", userInfo)       //设置访问的路由
    err := http.ListenAndServe(":8080", nil) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

参考:

关系型数据库MySQL:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "html/template"
    "log"
    "net/http"
    "time"
)

type User struct {
    Id          int
    Name        string
    Habits      string
    CreatedTime string
}

var tpl = `<html>
<head>
<title></title>
</head>
<body>
<form action="/info" method="post">
    用户名:<input type="text" name="username">
    兴趣爱好:<input type="text" name="habits">
    <input type="submit" value="提交">
</form>
</body>
</html>`

var db *sql.DB

var err error

func init() {
    db, err = sql.Open("mysql",
        "root:123456@tcp(172.17.0.3:3306)/micro?charset=utf8")
    checkErr(err)
}

func queryByName(name string) User {
    user := User{}
    stmt, err := db.Prepare("select * from user where name=?")
    checkErr(err)

    rows, _ := stmt.Query(name)

    fmt.Println("\nafter deleting records: ")
    for rows.Next() {
        var id int
        var name string
        var habits string
        var createdTime string
        err = rows.Scan(&id, &name, &habits, &createdTime)
        checkErr(err)
        fmt.Printf("[%d, %s, %s, %s]\n", id, name, habits, createdTime)
        user = User{id, name, habits, createdTime}
        break
    }
    return user
}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

func submitForm(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method:", r.Method) //获取请求的方法
    var t *template.Template
    t = template.New("Products") //创建一个模板
    t, _ = t.Parse(tpl)
    log.Println(t.Execute(w, nil))
}

func store(user User) {
    //插入数据
    stmt, err := db.Prepare("INSERT INTO user SET name=?,habits=?,created_time=?")
    t := time.Now().UTC().Format("2006-01-02")
    res, err := stmt.Exec(user.Name, user.Habits, t)
    checkErr(err)

    id, err := res.LastInsertId()
    checkErr(err)

    fmt.Printf("last insert id is: %d\n", id)
}

func userInfo(w http.ResponseWriter, r *http.Request) {
    //请求的是登录数据,那么执行登录的逻辑判断
    _ = r.ParseForm()
    if r.Method == "POST" {
        user1 := User{Name: r.Form.Get("username"), Habits: r.Form.Get("habits")}
        store(user1)
        fmt.Fprintf(w, " %v", queryByName("aoho")) //这个写入到w的是输出到客户端的
    }
}

func main() {
    http.HandleFunc("/form", submitForm)     //设置访问的路由
    http.HandleFunc("/info", userInfo)       //设置访问的路由
    err := http.ListenAndServe(":8080", nil) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
推荐阅读