模塊三go語言實戰(zhàn)應(yīng)用27講37丨strings包與字符串操作_第1頁
模塊三go語言實戰(zhàn)應(yīng)用27講37丨strings包與字符串操作_第2頁
模塊三go語言實戰(zhàn)應(yīng)用27講37丨strings包與字符串操作_第3頁
模塊三go語言實戰(zhàn)應(yīng)用27講37丨strings包與字符串操作_第4頁
模塊三go語言實戰(zhàn)應(yīng)用27講37丨strings包與字符串操作_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

我們今天主要來說一說標(biāo)準(zhǔn)庫中的srgs代碼包。這個代碼包也用到了不少ncde包ncduf8包中的程序?qū)嶓w。下面這個問題就是針對tisBile類型的。我們今天的問題是:與srg比,tisBile類型的值有哪些優(yōu)勢?先來說說sig類型。我們都知道,在Gotrg類型的值是不可變的。如果我們想獲得一個不一樣的字符串,那么就只能基于原字符串進(jìn)行裁剪、拼接等操作,從而生成一個新的字符串。在底層,一個tig值內(nèi)被一塊的內(nèi)間中時,內(nèi)存的字節(jié)數(shù)量也會被記錄下來,并用于表示該tig值的長度。你可以把這塊內(nèi)存的內(nèi)容看成一個字節(jié)數(shù)組,而相應(yīng)的sigsig值上應(yīng)用切片表達(dá)式,就相當(dāng)于在對其底層的字節(jié)數(shù)組做切片。另外,我們在進(jìn)行字符串拼接的時候,Go更具體地說,一個sigidr值中有一個用于承載內(nèi)容的容器(以下簡稱內(nèi)容容器)。它是一個以ye類型的切片(以下簡稱字節(jié)切片)。由于這樣的字節(jié)切片的底層數(shù)組就是一個字節(jié)數(shù)組,所以我們可以說它與sig容的方式是一樣的。實際上,它們都是通過一個uaePoter正是因為這樣的內(nèi)部構(gòu)造,Bler節(jié)切片本身來說,它包含的任何元素值都可以被修改,但是ulr這就意味著,已存在于ulr值中的內(nèi)容是不可變的。因此,我們可以利用uler值提供的方法拼接的內(nèi)容,而絲毫不用擔(dān)心這些方影響到已存在的內(nèi)容。這里所說的方法指的是,Bier值擁有的一系列指針方法,包括:ieWtBtertRnWiSrng我們可以通過調(diào)用上述方法把新的內(nèi)容拼接到已存在的內(nèi)容的尾部(也就是右邊)必要,uler值會自動地對自身的內(nèi)容容器進(jìn)行擴容。這里的自動擴容策略與切片的擴容策略一致。換句話說,我們在向uleridr值中已存在的內(nèi)容就不會再被拷貝。除了ulr值的自動擴容,我們還可以選擇手動擴容,這通過調(diào)用uder值的Gow方法就可以做到。row方法也可以被稱為擴容方法,它接受一個nt類型的參數(shù)n必要,rw方把其所屬值中內(nèi)容容器的容量增加n字節(jié)更體講它生成一個字節(jié)切片作為新的內(nèi)容容器,該切片的容量會是原容器容量的二倍再加上n。之后,它會把原容器中的所有字節(jié)全部拷貝到新容器中。varbuilder1fmt.Println("Growthebuilderfmt.Printf("Thelengthofcontentsinthebuilderis%d.\n",當(dāng)然,Grow方法還可能什么都不做。這種情況的前提條件是:當(dāng)前的內(nèi)容容器中的未用容量已經(jīng)夠用了,即:未用容量大于或等于n的前提條件是類似的。fmt.Println("Resetthebuilderfmt.Printf("Thethirdoutput(%d):\n%q\n",builder1.Len(),最后,Builder值是可以被重用的。通過調(diào)用它的Reset方法,我們可以讓Builder一旦被重用,ulr被Go語言的回收器標(biāo)記并回收掉。問題我們只要調(diào)用了Bier調(diào)用們,就不以任方式所屬行。否只要何副本上調(diào)用上述方法就都會panic。這種panic會告訴我們,這樣的使用方式是并不合法的,因為這里的Builder值是副本而varbuilder1builder3:=//builder3.Grow(1)//這里會panic_=正是由于已使用的Bler值不能再被,所以肯定不會出現(xiàn)多個uler容器(也就是那個字節(jié)切片)共用一個底層字節(jié)數(shù)組的情況。這樣也就避免了多個同源的idr值在拼接內(nèi)容時可能產(chǎn)生的問題。不過,雖然已使用的uler不再被,它的值卻。無么時,我們都可以通過任何方式這樣的指針值。注意,這樣的指針值指向的都會是同一個idrf2:=func(bp*strings.Builder)(*bp).Grow(1)//這里雖然不會panic,但不是并發(fā)安全的builder4:=//builder4.Grow(1)//這里會panic_=67正因為如此,這里就產(chǎn)生了一個問題,即:如果uler生。這就是我們所說的操作和并發(fā)安全問題。idr值自己是無法解決這些問題的。所以,我們在通過傳遞其指針值共享ulr值Bler值以及它的指針值。我們可以在各處分別一個uler值來使用,也可以先一個uler值,然后在eet方法即可。builder5:=builder5.Grow(1)//這里不會panic總之,關(guān)于ier值的約束是有意義的,也是很有必要的。雖然我們?nèi)匀豢梢酝ㄟ^某些方式共享Bilr的Bler值,不會有任何問題。與srgBider類型恰恰相反,tnsReer類型是為了高效字符串而存在的。后者的高效主要體現(xiàn)在它對字符串的機制上,它封裝了很多用于在tig內(nèi)容的最佳實踐。rns.ae類型的值(以下簡稱Rdr值串中的內(nèi)容。在的過程中,edr值會保存已的字節(jié)的計數(shù)(以下簡稱已讀計此外,這個已讀計數(shù)也是回退和位置設(shè)定時的重要依據(jù)。雖然它屬于Rdr部結(jié)構(gòu),但我們還是可以通過該值的LnSze把它計算出來的。代碼如下:varreader1readingIndex:=reader1.Size()-int64(reader1.Len())//aer值擁有的大部分用于的方法都會及時地更新已讀計數(shù)。比如,Rdyte會在成功后將這個計數(shù)的值加1。,Rdune在功之會把被的所占字節(jié)為計增除此之外,edrek方法也會更新該值的已讀計數(shù)。實際上,這個Sk次的起始索引位置。另外,如果我們把常量oSkurentfst的值來計算新的計數(shù)值。offset2:=expectedIndex:=reader1.Size()-int64(reader1.Len())+fmt.Printf("Seekwithoffset%dandwhence%d...\n",offset2,readingIndex,_:=reader1.Seek(offset2,fmt.Printf("Thereadingindexinreader:%d(returnedbySeek)\n",fmt.Printf("Thereadingindexinreader:%d(computedbyme)\n",綜上所述,edr現(xiàn)高的就在內(nèi)部讀計計數(shù)就代下一次的起始索引位置。它可以很容易地被計算出來。edrek方法可以直接設(shè)定該值中的已讀計數(shù)值。今天,我們主要討論了tis代碼包中的兩個重要類型,即:Bier和eer者用于構(gòu)建字符串,而后者則用于字符串。與rg值相比,lr值的優(yōu)勢主要體現(xiàn)在字符串拼接方面。它可以在保證已存在的內(nèi)容不變的前提下,拼接的內(nèi)容,并且會在拼接的過程中,盡量減少內(nèi)存分配和內(nèi)容拷貝的次數(shù)。不過,這類值在使用上也是有約束的。它在被真正使用之后就不能再被了,否則就會引發(fā)panic。雖然這個約束很嚴(yán)格,但是也可以帶來一定的好處。它可以有效地避免一些操作。雖然我們可以通過一些(比如傳遞它的指針值)繞過個束但是大利的。最好的解決方案就是分別、分開使用、互不。aer值讓我方便一符串內(nèi)容的高要體它對串的機制上。在的過程中,Rar會保已節(jié)的,也讀計。計數(shù)著下次始索置,也是鍵所我們利用Ln方法和Se方法,計算出其中的已讀計數(shù)的值。有了它,我們就可以更加靈活地進(jìn)行字符串了。我只在本文介紹了上述兩個數(shù)據(jù)類型,但并不意味著srgssrgs包還提供了大量的函數(shù)。比如: 今天的思考題是:*rns.idersrn.edeGo 售賣。頁面已增加防盜追蹤,將依法其上一 36|unicode與字符編 5 //Stringreturnstheaccumulatedstring.func(b*Builder)St

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論