第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

符文與字符串范圍內(nèi)的字節(jié)

符文與字符串范圍內(nèi)的字節(jié)

Go
飲歌長嘯 2023-07-31 16:37:57
看起來當(dāng)我們是range一個字符串時,我們得到的字符是rune類型,但是如果我們通過 獲取它str[index],它們將是byte類型,為什么呢?
查看完整描述

3 回答

?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個贊

對于第一級,原因是因?yàn)檫@就是語言的定義方式。String類型告訴我們:

字符串值是一個(可能為空)字節(jié)序列。字節(jié)數(shù)稱為字符串的長度,并且永遠(yuǎn)不會是負(fù)數(shù)。字符串是不可變的:一旦創(chuàng)建,就不可能更改字符串的內(nèi)容。

和:

字符串的字節(jié)可以通過整數(shù)索引 0 到 len(s)-1 來訪問。

同時,range是一個可以插入到for語句中的子句,并且規(guī)范說:

“range”子句右邊的表達(dá)式稱為范圍表達(dá)式,它可以是... [a] string ...

和:

  1. 對于字符串值,“range”子句從字節(jié)索引 0 開始迭代字符串中的 Unicode 代碼點(diǎn)。在連續(xù)迭代中,索引值將是連續(xù) UTF-8 編碼代碼點(diǎn)的第一個字節(jié)的索引字符串和類型為 的第二個值rune將是相應(yīng)代碼點(diǎn)的值。如果迭代遇到無效的 UTF-8 序列,則第二個值將為0xFFFDUnicode 替換字符,并且下一次迭代將在字符串中前進(jìn)一個字節(jié)。

如果你想知道為什么語言是這樣定義的,你真的必須問定義者本身。但是,請注意,如果for僅在字節(jié)范圍內(nèi)進(jìn)行調(diào)整,則您需要構(gòu)建自己的更高級的循環(huán)來在符文范圍內(nèi)進(jìn)行調(diào)整。鑒于這for ... range?確實(shí)可以通過符文進(jìn)行操作,如果您通過字符串中的字節(jié)進(jìn)行操作s,您可以編寫:

for?i?:=?0;?i?<?len(s);?i++?{
????...
}

并輕松訪問s[i]循環(huán)內(nèi)部。你也可以寫:

for?i,?b?:=?range?[]byte(s)?{
}

并在循環(huán)內(nèi)訪問索引i和字節(jié)。b(從 string 到 的轉(zhuǎn)換[]byte,反之亦然,可能需要一個副本,因?yàn)?code>[]byte可以修改。但在這種情況下,range不會修改它,編譯器可以優(yōu)化掉副本。



查看完整回答
反對 回復(fù) 2023-07-31
?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個贊

只是一個快速而簡單的答案,說明為什么以這種方式定義語言。

想想符文是什么。Arune代表一個Unicode碼點(diǎn),可以由多個字節(jié)組成,根據(jù)編碼的不同也有不同的表示形式。

現(xiàn)在想想mystring[i]如果返回 arune而不是 a ,那么這樣做意味著什么byte。由于如果不掃描字符串就無法知道每個符文的長度,因此該操作需要每次掃描整個字符串,從而使類似數(shù)組的訪問需要 O(n) 而不是 O(1)。

mystring[i]如果每次都掃描整個字符串,對于該語言的用戶來說是非常違反直覺的,對于語言開發(fā)人員來說也更加復(fù)雜。這就是為什么大多數(shù)編程語言(如 Go、Rust、Python)區(qū)分 Unicode 字符和字節(jié),有時僅支持字節(jié)索引。

當(dāng)從字符串的開頭迭代時,一次訪問一個字符串rune要簡單得多,例如使用range. 可以掃描連續(xù)的字節(jié)并將其分組在一起,直到它們形成可以作為 返回的有效 Unicode 字符rune,然后繼續(xù)處理下一個字節(jié)。


查看完整回答
反對 回復(fù) 2023-07-31
?
蕪湖不蕪

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個贊

只是讓你知道。如果您想使用經(jīng)典的 for循環(huán)迭代string并使用運(yùn)算符[]來獲取rune,您可以執(zhí)行以下操作:


{

  rstr := []rune(MyString)

  for idx := 0; idx < len(rstr); idx++ {

    // code before...

    currentRune := rstr[idx]

    _ = currentRune // to avoid unused error

    // code after...

  }

}


查看完整回答
反對 回復(fù) 2023-07-31
  • 3 回答
  • 0 關(guān)注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號