ext store 数据修改_Go 数据存储篇(一):基于内存存储实现数据增删改查功能...
在 Web 編程中,經常需要處理用戶請求數據,而用戶請求數據的處理往往又涉及到數據存儲與獲取,支持存儲數據的媒介很多,包括內存、文件系統、數據庫等,接下來,學院君將花幾個篇幅的教程來系統介紹 Go Web 編程中的數據存儲與獲取。
首先我們來看內存存儲。
相較于磁盤文件和數據庫,內存存取性能與效率是最高的,但是價格也是高昂的,這就導致內存存儲空間有限;另外,內存數據不能持久化存儲,如果系統斷電或者異常重啟,那么存儲在內存中的數據都會消失。
因此,我們通??梢詫斍斑\行程序需要處理的數據臨時存放到內存中,以便提高程序性能,處理完成后持久化到磁盤(關系型數據庫最終也是將數據存儲到磁盤文件)中,從而充分利用內存的高性能和磁盤的大空間和數據可持久化,這樣,即便系統重啟后,再次啟動程序也可以從磁盤文件讀取之前存儲的數據到內存進行初始化。
基于內存存取數據需要借助特定的數據結構,在 Go 語言中,這些數據結構包括基本類型(數字、字符串)、數組(array)、切片(slice)、字典(map)、結構體(struct)等,下面我們來簡單演示如何基于 Go 語言的這些數據結構實現用戶數據的臨時存儲。
在這個示例中,我們將創建用于存儲文章數據的字典數據結構,并且在字典中存放多個通過結構體表示的文章數據(詳細細節已經通過注釋標注,這里不一一介紹了),最后從這些字典中讀取數據并打印出來:
package?mainimport?"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 開發桌面應用程序(GUI):Webview、Lorca 與 Electron
站長 polarisxu
自己的原創文章
不限于 Go 技術
職場和創業經驗
Go語言中文網
每天為你
分享 Go 知識
Go愛好者值得關注
總結
以上是生活随笔為你收集整理的ext store 数据修改_Go 数据存储篇(一):基于内存存储实现数据增删改查功能...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: drtek收音机使用说明_一百年前的便携
- 下一篇: pg 递归算法_16. 图的______