您好,登錄后才能下訂單哦!
這篇文章給大家介紹Go數據存儲中如何基于內存存儲實現數據增刪改查功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
在 Web 編程中,經常需要處理用戶請求數據,而用戶請求數據的處理往往又涉及到數據存儲與獲取,支持存儲數據的媒介很多,包括內存、文件系統、數據庫等,接下來,學院君將花幾個篇幅的教程來系統介紹 Go Web 編程中的數據存儲與獲取。
首先我們來看內存存儲。
相較于磁盤文件和數據庫,內存存取性能與效率是最高的,但是價格也是高昂的,這就導致內存存儲空間有限;另外,內存數據不能持久化存儲,如果系統斷電或者異常重啟,那么存儲在內存中的數據都會消失。
因此,我們通常可以將當前運行程序需要處理的數據臨時存放到內存中,以便提高程序性能,處理完成后持久化到磁盤(關系型數據庫最終也是將數據存儲到磁盤文件)中,從而充分利用內存的高性能和磁盤的大空間和數據可持久化,這樣,即便系統重啟后,再次啟動程序也可以從磁盤文件讀取之前存儲的數據到內存進行初始化。
基于內存存取數據需要借助特定的數據結構,在 Go 語言中,這些數據結構包括基本類型(數字、字符串)、數組(array)、切片(slice)、字典(map)、結構體(struct)等,下面我們來簡單演示如何基于 Go 語言的這些數據結構實現用戶數據的臨時存儲。
在這個示例中,我們將創建用于存儲文章數據的字典數據結構,并且在字典中存放多個通過結構體表示的文章數據(詳細細節已經通過注釋標注,這里不一一介紹了),最后從這些字典中讀取數據并打印出來:
package main
import "fmt"
// 存放文章信息的 Post 結構體
type Post struct {
Id int
Title string
Content string
Author string
}
// 以 ID 字段為鍵的 Post 字典
var PostsById map[int]*Post
// 以作者字段為鍵的 Post 切片字典(一個作者可能對應多篇文章)
var PostsByAuthor map[string][]*Post
// 添加 Post 實例到對應的字典
func store(post Post) {
PostsById[post.Id] = &post
PostsByAuthor[post.Author] = append(PostsByAuthor[post.Author], &post)
}
func main() {
// 初始化字典
PostsById = make(map[int]*Post)
PostsByAuthor = make(map[string][]*Post)
// 初始化文章信息
post1 := Post{Id: 1, Title: "PHP 全棧工程師指南", Content: "基于 Laravel + Vue.js 開發 Web 項目", Author: "學院君"}
post2 := Post{Id: 2, Title: "Go 入門教程", Content: "Go 語言基礎語法和使用指南", Author: "學院君"}
post3 := Post{Id: 3, Title: "Go Web 編程", Content: "基于 Gin 框架構建 Web 項目", Author: "學院君"}
post4 := Post{Id: 4, Title: "微服務從入門到實踐", Content: "基于 Laravel + go-micro 框架構建微服務", Author: "學院君"}
// 存儲文章到字典
store(post1)
store(post2)
store(post3)
store(post4)
// 測試1:打印特定文章(從字典通過 ID 獲取文章)
fmt.Println(PostsById[1])
fmt.Println(PostsById[2])
// 測試2:打印特定文章(從字典通過作者獲取文章切片)
for _, post := range PostsByAuthor["學院君"] {
fmt.Println(post)
}
}
執行上述代碼,打印結果如下:
其中前面兩條是從 PostsById
字典中獲取的數據,后面四條是從 PostsByAuthor
字典中獲取的數據。
以上演示的是從內存數據結構中插入和查詢數據,你還可以基于這些 Go 內置數據結構支持的語法實現數據修改和刪除功能:
// 修改數據
PostsById[1].Author = "學院君小號"
// 刪除數據
delete(PostsByAuthor, "學院君")
再次打印字典:
// 測試3:再次打印字典
fmt.Printf("%#v\n", PostsById[1])
for _, post := range PostsByAuthor["學院君"] {
fmt.Println(post)
}
可以看到這次 PostsById[1]
對應的 Post.Author
字段值變成了 學院君小號
,而 PostsByAuthor
字典為空(未打印出任何信息):
這樣一來,我們就結合 Go 內置的基本類型、切片、字典、結構體實現了簡單的基于內存存儲的數據增刪改查功能,雖然效率是最高的,但是如前面所說,基于內存的數據存儲無法實現持久化,另外,內存空間是有限的,幾十幾百條數據存儲到內存還行,要是成千上萬、乃至百萬千萬級數據存儲到內存也是不現實的,要持久化存儲大量數據,需要借助磁盤文件,下篇教程,學院君就來給大家介紹如何將用戶數據存儲到磁盤。
關于Go數據存儲中如何基于內存存儲實現數據增刪改查功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。