
服务端数据内存存储
在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) } }