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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

有沒有辦法判斷兩個(gè)字符串是否在 Go 中共享內(nèi)存?

有沒有辦法判斷兩個(gè)字符串是否在 Go 中共享內(nèi)存?

Go
富國(guó)滬深 2021-06-10 16:09:30
在 Go 中,字符串在內(nèi)部存儲(chǔ)為 C 結(jié)構(gòu):struct String // This is C code (not Go){  byte* str;  int32 len;};假設(shè)我有以下變量:a0 := "ap" // This is Go codea1 := "ple"b0 := "app"b1 := "le"a := a0 + a1b := b0 + b1c := "apple"d := c然后如下代碼:fmt.Println("a == b = %t, &a == &b = %t", a == b, &a == &b)fmt.Println("c == d = %t, &c == &d = %t", c == d, &c == &d)輸出:a == b = true, &a == &b = falsec == d = true, &c == &d = false因?yàn)?amp;a == &b比較 C 結(jié)構(gòu)的地址,而a == b比較字符串的值。有沒有辦法測(cè)試字符串本身是否存儲(chǔ)在同一個(gè)地方(即strC 結(jié)構(gòu)中的字段具有相同的值),這樣比較a和b很可能會(huì)產(chǎn)生false,而比較c和d幾乎肯定會(huì)產(chǎn)生true?
查看完整描述

2 回答

?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

是的,這是可能的。使用reflect包獲取兩個(gè)實(shí)例的String Headersstring。然后,你可以比較兩個(gè)DataLen領(lǐng)域來計(jì)算字符串?dāng)?shù)組的支持是否在內(nèi)存中確實(shí)重疊。

注意:StringHeaderstruct 是一個(gè)實(shí)現(xiàn)細(xì)節(jié),語言規(guī)范中沒有提到它。因此,任何執(zhí)行上一段中討論的操作的代碼都不是真正可移植的 Go。IOW,我不鼓勵(lì)在好奇心/研究等之外使用此類代碼。來自文檔:

StringHeader 是字符串的運(yùn)行時(shí)表示。它不能安全或可移植地使用,其表示形式可能會(huì)在以后的版本中更改。此外,Data 字段不足以保證它引用的數(shù)據(jù)不會(huì)被垃圾收集,因此程序必須保留一個(gè)單獨(dú)的、正確類型的指向底層數(shù)據(jù)的指針。

編輯:

*reflect.StringHeader hdrstring實(shí)例獲取 a 的未經(jīng)測(cè)試的代碼str

hdr := (*reflect.StringHeader)(unsafe.Pointer(&str))


查看完整回答
反對(duì) 回復(fù) 2021-06-21
?
慕哥6287543

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊

strings的程度是 Go 編譯器實(shí)現(xiàn)的細(xì)節(jié)。對(duì)于當(dāng)前gcgccgo編譯器,相同的string文字在編譯和鏈接時(shí)被保留。在運(yùn)行時(shí)生成的其他string文字和strings 不會(huì)被實(shí)習(xí)。


查看完整回答
反對(duì) 回復(fù) 2021-06-21
  • 2 回答
  • 0 關(guān)注
  • 254 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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