ext store 数据修改_Go 数据存储篇(一):基于内存存储实现数据增删改查功能...
在 Web 編程中,經(jīng)常需要處理用戶(hù)請(qǐng)求數(shù)據(jù),而用戶(hù)請(qǐng)求數(shù)據(jù)的處理往往又涉及到數(shù)據(jù)存儲(chǔ)與獲取,支持存儲(chǔ)數(shù)據(jù)的媒介很多,包括內(nèi)存、文件系統(tǒng)、數(shù)據(jù)庫(kù)等,接下來(lái),學(xué)院君將花幾個(gè)篇幅的教程來(lái)系統(tǒng)介紹 Go Web 編程中的數(shù)據(jù)存儲(chǔ)與獲取。
首先我們來(lái)看內(nèi)存存儲(chǔ)。
相較于磁盤(pán)文件和數(shù)據(jù)庫(kù),內(nèi)存存取性能與效率是最高的,但是價(jià)格也是高昂的,這就導(dǎo)致內(nèi)存存儲(chǔ)空間有限;另外,內(nèi)存數(shù)據(jù)不能持久化存儲(chǔ),如果系統(tǒng)斷電或者異常重啟,那么存儲(chǔ)在內(nèi)存中的數(shù)據(jù)都會(huì)消失。
因此,我們通常可以將當(dāng)前運(yùn)行程序需要處理的數(shù)據(jù)臨時(shí)存放到內(nèi)存中,以便提高程序性能,處理完成后持久化到磁盤(pán)(關(guān)系型數(shù)據(jù)庫(kù)最終也是將數(shù)據(jù)存儲(chǔ)到磁盤(pán)文件)中,從而充分利用內(nèi)存的高性能和磁盤(pán)的大空間和數(shù)據(jù)可持久化,這樣,即便系統(tǒng)重啟后,再次啟動(dòng)程序也可以從磁盤(pán)文件讀取之前存儲(chǔ)的數(shù)據(jù)到內(nèi)存進(jìn)行初始化。
基于內(nèi)存存取數(shù)據(jù)需要借助特定的數(shù)據(jù)結(jié)構(gòu),在 Go 語(yǔ)言中,這些數(shù)據(jù)結(jié)構(gòu)包括基本類(lèi)型(數(shù)字、字符串)、數(shù)組(array)、切片(slice)、字典(map)、結(jié)構(gòu)體(struct)等,下面我們來(lái)簡(jiǎn)單演示如何基于 Go 語(yǔ)言的這些數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)用戶(hù)數(shù)據(jù)的臨時(shí)存儲(chǔ)。
在這個(gè)示例中,我們將創(chuàng)建用于存儲(chǔ)文章數(shù)據(jù)的字典數(shù)據(jù)結(jié)構(gòu),并且在字典中存放多個(gè)通過(guò)結(jié)構(gòu)體表示的文章數(shù)據(jù)(詳細(xì)細(xì)節(jié)已經(jīng)通過(guò)注釋標(biāo)注,這里不一一介紹了),最后從這些字典中讀取數(shù)據(jù)并打印出來(lái):
package?mainimport?"fmt"
//?存放文章信息的?Post?結(jié)構(gòu)體
type?Post?struct?{
????Id?int
????Title?string
????Content?string
????Author?string
}
//?以?ID?字段為鍵的?Post?字典
var?PostsById?map[int]*Post
//?以作者字段為鍵的?Post?切片字典(一個(gè)作者可能對(duì)應(yīng)多篇文章)
var?PostsByAuthor?map[string][]*Post
//?添加?Post?實(shí)例到對(duì)應(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?開(kāi)發(fā)?Web?項(xiàng)目",?Author:?"學(xué)院君"}
????post2?:=?Post{Id:?2,?Title:?"Go?入門(mén)教程",?Content:?"Go?語(yǔ)言基礎(chǔ)語(yǔ)法和使用指南",?Author:?"學(xué)院君"}
????post3?:=?Post{Id:?3,?Title:?"Go?Web?編程",?Content:?"基于?Gin?框架構(gòu)建?Web?項(xiàng)目",?Author:?"學(xué)院君"}
????post4?:=?Post{Id:?4,?Title:?"微服務(wù)從入門(mén)到實(shí)踐",?Content:?"基于?Laravel?+?go-micro?框架構(gòu)建微服務(wù)",?Author:?"學(xué)院君"}
????//?存儲(chǔ)文章到字典
????store(post1)
????store(post2)
????store(post3)
????store(post4)
????//?測(cè)試1:打印特定文章(從字典通過(guò) ID 獲取文章)
????fmt.Println(PostsById[1])
????fmt.Println(PostsById[2])
????//?測(cè)試2:打印特定文章(從字典通過(guò)作者獲取文章切片)
????for?_,?post?:=?range?PostsByAuthor["學(xué)院君"]?{
????????fmt.Println(post)
????}
}
執(zhí)行上述代碼,打印結(jié)果如下:
其中前面兩條是從 PostsById 字典中獲取的數(shù)據(jù),后面四條是從 PostsByAuthor 字典中獲取的數(shù)據(jù)。
以上演示的是從內(nèi)存數(shù)據(jù)結(jié)構(gòu)中插入和查詢(xún)數(shù)據(jù),你還可以基于這些 Go 內(nèi)置數(shù)據(jù)結(jié)構(gòu)支持的語(yǔ)法實(shí)現(xiàn)數(shù)據(jù)修改和刪除功能:
//?修改數(shù)據(jù)PostsById[1].Author?=?"學(xué)院君小號(hào)"
//?刪除數(shù)據(jù)
delete(PostsByAuthor,?"學(xué)院君")
再次打印字典:
//?測(cè)試3:再次打印字典fmt.Printf("%#v\n",?PostsById[1])
for?_,?post?:=?range?PostsByAuthor["學(xué)院君"]?{
????fmt.Println(post)
}
可以看到這次 PostsById[1] 對(duì)應(yīng)的 Post.Author 字段值變成了 學(xué)院君小號(hào),而 PostsByAuthor 字典為空(未打印出任何信息):
這樣一來(lái),我們就結(jié)合 Go 內(nèi)置的基本類(lèi)型、切片、字典、結(jié)構(gòu)體實(shí)現(xiàn)了簡(jiǎn)單的基于內(nèi)存存儲(chǔ)的數(shù)據(jù)增刪改查功能,雖然效率是最高的,但是如前面所說(shuō),基于內(nèi)存的數(shù)據(jù)存儲(chǔ)無(wú)法實(shí)現(xiàn)持久化,另外,內(nèi)存空間是有限的,幾十幾百條數(shù)據(jù)存儲(chǔ)到內(nèi)存還行,要是成千上萬(wàn)、乃至百萬(wàn)千萬(wàn)級(jí)數(shù)據(jù)存儲(chǔ)到內(nèi)存也是不現(xiàn)實(shí)的,要持久化存儲(chǔ)大量數(shù)據(jù),需要借助磁盤(pán)文件,下篇教程,學(xué)院君就來(lái)給大家介紹如何將用戶(hù)數(shù)據(jù)存儲(chǔ)到磁盤(pán)。
(全文完)
推薦閱讀
用 Go 開(kāi)發(fā)桌面應(yīng)用程序(GUI):Webview、Lorca 與 Electron
站長(zhǎng) polarisxu
自己的原創(chuàng)文章
不限于 Go 技術(shù)
職場(chǎng)和創(chuàng)業(yè)經(jīng)驗(yàn)
Go語(yǔ)言中文網(wǎng)
每天為你
分享 Go 知識(shí)
Go愛(ài)好者值得關(guān)注
總結(jié)
以上是生活随笔為你收集整理的ext store 数据修改_Go 数据存储篇(一):基于内存存储实现数据增删改查功能...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: drtek收音机使用说明_一百年前的便携
- 下一篇: pg 递归算法_16. 图的______