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