<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go 數(shù)據(jù)存儲(chǔ)篇(一):基于內(nèi)存存儲(chǔ)實(shí)現(xiàn)數(shù)據(jù)增刪改查功能

          共 2598字,需瀏覽 6分鐘

           ·

          2020-09-05 04:26

          在 Web 編程中,經(jīng)常需要處理用戶請(qǐng)求數(shù)據(jù),而用戶請(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ǔ)。

          相較于磁盤文件和數(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)存中,以便提高程序性能,處理完成后持久化到磁盤(關(guān)系型數(shù)據(jù)庫(kù)最終也是將數(shù)據(jù)存儲(chǔ)到磁盤文件)中,從而充分利用內(nèi)存的高性能和磁盤的大空間和數(shù)據(jù)可持久化,這樣,即便系統(tǒng)重啟后,再次啟動(dòng)程序也可以從磁盤文件讀取之前存儲(chǔ)的數(shù)據(jù)到內(nèi)存進(jìn)行初始化。

          基于內(nèi)存存取數(shù)據(jù)需要借助特定的數(shù)據(jù)結(jié)構(gòu),在 Go 語(yǔ)言中,這些數(shù)據(jù)結(jié)構(gòu)包括基本類型(數(shù)字、字符串)、數(shù)組(array)、切片(slice)、字典(map)、結(jié)構(gòu)體(struct)等,下面我們來(lái)簡(jiǎn)單演示如何基于 Go 語(yǔ)言的這些數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)用戶數(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?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?切片字典(一個(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?開發(fā)?Web?項(xiàng)目",?Author:?"學(xué)院君"}
          ????post2?:=?Post{Id:?2,?Title:?"Go?入門教程",?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ù)從入門到實(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)中插入和查詢數(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)置的基本類型、切片、字典、結(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ù),需要借助磁盤文件,下篇教程,學(xué)院君就來(lái)給大家介紹如何將用戶數(shù)據(jù)存儲(chǔ)到磁盤。

          (全文完)




          推薦閱讀



          學(xué)習(xí)交流 Go 語(yǔ)言,掃碼回復(fù)「進(jìn)群」即可


          站長(zhǎng) polarisxu

          自己的原創(chuàng)文章

          不限于 Go 技術(shù)

          職場(chǎng)和創(chuàng)業(yè)經(jīng)驗(yàn)


          Go語(yǔ)言中文網(wǎng)

          每天為你

          分享 Go 知識(shí)

          Go愛好者值得關(guān)注



          瀏覽 52
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久艹视频精品 | 中文字幕中文字幕无码 | av无码aV天天aV天天爽第一集 | 日本免费黄色an电影 | 屌操网 |