中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

汕尾做網(wǎng)站如何做免費(fèi)網(wǎng)絡(luò)推廣

汕尾做網(wǎng)站,如何做免費(fèi)網(wǎng)絡(luò)推廣,wordpress使用https,有哪些專(zhuān)業(yè)做飾品的網(wǎng)站app1. 前言 之前在設(shè)計(jì)一個(gè)兼容函數(shù)的時(shí)候,使用了sjson動(dòng)態(tài)設(shè)入?yún)?shù),從而實(shí)現(xiàn)一些參數(shù)的兼容。大致的邏輯如下所示: // 有一堆不規(guī)則的json數(shù)據(jù) {"a":"aaa","b":"bbb","any_key1":{"k…

1. 前言

之前在設(shè)計(jì)一個(gè)兼容函數(shù)的時(shí)候,使用了sjson動(dòng)態(tài)設(shè)入?yún)?shù),從而實(shí)現(xiàn)一些參數(shù)的兼容。大致的邏輯如下所示:

// 有一堆不規(guī)則的json數(shù)據(jù)
{"a":"aaa","b":"bbb","any_key1":{"key":"value"},"any_key2":{"key":"value"}
}
// 因?yàn)閍ny_key1和any_key2這樣的數(shù)字字符串的key還會(huì)有新增,所以這個(gè)是無(wú)法固定的,沒(méi)有辦法給到一個(gè)具體的結(jié)構(gòu)體解析,于是就人為的兼容,給它們?cè)谔幚淼臅r(shí)候包一個(gè)外層的key
{"a":"aaa","b":"bbb","number_key_data":{"any_key1":{"key":"value"},"any_key2":{"key":"value"}}
}
// 這樣處理之后,我只要定義number_key_data,我就可以獲取到具體的字符串?dāng)?shù)字為key的數(shù)據(jù)

2. 實(shí)現(xiàn)

采用sjson對(duì)對(duì)應(yīng)的非特定key進(jìn)行新的結(jié)構(gòu)值設(shè)入,然后做一個(gè)兼容即可實(shí)現(xiàn)上面的邏輯,于是有這段代碼出來(lái)了。

package gjson_set_studyimport ("encoding/json""fmt""github.com/tidwall/sjson""testing"
)func TestGjsonSet(t *testing.T) {data := `{"a":"aaa","b":"bbb","any_key1":{"key":"value"},"any_key2":{"key":"value"}}`dataMap := map[string]interface{}{}err := json.Unmarshal([]byte(data), &dataMap)if err != nil {panic(err)}fmt.Println(adaptNumberKey(data, dataMap))// output// {"a":"aaa","b":"bbb","number_key_data":{"any_key1":{"key":"value"},"any_key2":{"key":"value"}}} <nil>
}type Data struct {A             string `json:"a"`B             string `json:"b"`NumberKeyData map[string]struct {Key   string `json:"key"`Value string `json:"value"`} `json:"number_key_data"`
}var specificKeys = map[string]bool{"a": true,"b": true,
}func adaptNumberKey(data string, dataMap map[string]interface{}) (string, error) {var err errorfor k, v := range dataMap {if _, ok := specificKeys[k]; ok {continue}data, err = sjson.Delete(data, k) // remove firstif err != nil {return "", fmt.Errorf("delete key data error, key=%s, err=%w", k, err)}data, err = sjson.Set(data, "number_key_data."+k, v)if err != nil {// log...return "", fmt.Errorf("set number_key_data error, key=%s, err=%w", k, err)}}return data, nil
}

上面的實(shí)現(xiàn),不出意外的話是不會(huì)有任何的問(wèn)題,但是不出意外的意外出現(xiàn)了,當(dāng)類(lèi)似的邏輯代碼上線之后,我們發(fā)現(xiàn)一個(gè)問(wèn)題:容器會(huì)爆內(nèi)存。這代碼也實(shí)現(xiàn)了自測(cè),也過(guò)了QA的測(cè)試,為什么會(huì)突然爆內(nèi)存呢?

3. 問(wèn)題

容器爆內(nèi)存的問(wèn)題出現(xiàn)了,但并不是所有的數(shù)據(jù)都爆內(nèi)存,有一組數(shù)據(jù)100%會(huì)爆內(nèi)存,它們的數(shù)據(jù)類(lèi)似:

{"a":"aaa","b":"bbb","1000000":{"key":"value"},"50000000":{"key":"value"}}

比較明顯的是出現(xiàn)了數(shù)字字符串的key,然后結(jié)合代碼看了一下,剛開(kāi)始也沒(méi)看出啥異常,覺(jué)得這個(gè)修改后的數(shù)據(jù)應(yīng)該是:

{"a":"aaa","b":"bbb","number_key_data":{"1000000":{"key":"value"},"50000000":{"key":"value"}}}

但后面發(fā)現(xiàn)爆內(nèi)存的問(wèn)題,又想起了設(shè)置數(shù)組的方式,當(dāng)前的代碼邏輯如果遇到數(shù)字key,就會(huì)被認(rèn)為是在設(shè)置數(shù)組,開(kāi)辟幾百萬(wàn)甚至上千萬(wàn)長(zhǎng)度的數(shù)組?(細(xì)思極恐) 于是就發(fā)現(xiàn)了爆內(nèi)存的問(wèn)題所在:數(shù)字key在未經(jīng)特殊標(biāo)識(shí)的情況下,會(huì)被認(rèn)定為數(shù)組,于是這個(gè)設(shè)置key的過(guò)程,就變成了對(duì)一個(gè)key的長(zhǎng)為1000000的數(shù)組設(shè)置值(后者是50000000),可怕。

4. 解決方法

于是參看源碼,照著sjson的set方法一路向下看,可以發(fā)現(xiàn)如果在parsePath 中我們對(duì)路徑添加了: 的前綴,sjson會(huì)強(qiáng)制把這個(gè)key當(dāng)做string key,而在atoui中不會(huì)將其解析為一個(gè)具體的數(shù)字,進(jìn)而導(dǎo)致對(duì)字符串key的設(shè)置,變成對(duì)數(shù)組的設(shè)值。

func parsePath(path string) (res pathResult, simple bool) {var r pathResultif len(path) > 0 && path[0] == ':' { // 如果含有:符號(hào),這個(gè)key會(huì)被強(qiáng)制認(rèn)定為keyr.force = truepath = path[1:]}for i := 0; i < len(path); i++ { // 對(duì)path進(jìn)行分解if path[i] == '.' {r.part = path[:i]r.gpart = path[:i]r.path = path[i+1:]r.more = truereturn r, true}if !isSimpleChar(path[i]) {return r, false}if path[i] == '\\' {// go into escape mode. this is a slower path that// strips off the escape character from the part.// ...}return r, true
}// atoui does a rip conversion of string -> unigned int.
func atoui(r pathResult) (n int, ok bool) {if r.force {return 0, false}for i := 0; i < len(r.part); i++ {if r.part[i] < '0' || r.part[i] > '9' {return 0, false}n = n*10 + int(r.part[i]-'0')}return n, true
}

于是修改代碼邏輯,將所有key的前綴都加上:的標(biāo)識(shí)。

func adaptNumberKey(data string, dataMap map[string]interface{}) (string, error) {var err errorfor k, v := range dataMap {if _, ok := specificKeys[k]; ok {continue}data, err = sjson.Delete(data, k) // remove firstif err != nil {return "", fmt.Errorf("delete key data error, key=%s, err=%w", k, err)}data, err = sjson.Set(data, "number_key_data."+":"+k, v)if err != nil {// log...return "", fmt.Errorf("set number_key_data error, key=%s, err=%w", k, err)}}return data, nil
}
// Output: {"a":"aaa","b":"bbb","number_key_data":{"1000000":{"key":"value"},"50000000":{"key":"value"}}} <nil>

5. 小結(jié)

忽然想到遇到的這個(gè)小問(wèn)題,當(dāng)時(shí)就覺(jué)得還是自己?jiǎn)螠y(cè)的場(chǎng)景不夠全面,導(dǎo)致了這次爆內(nèi)存的問(wèn)題發(fā)生,還好有臨時(shí)解決方案,不然對(duì)線上服務(wù)造成的影響還真不小。通過(guò)這個(gè)事例,再一次告誡自己在后續(xù)的代碼編寫(xiě)中,對(duì)于通用功能的邏輯代碼,要盡可能的思考一些邊緣case,從而避免在上線后邊緣case導(dǎo)致代碼崩潰的現(xiàn)象出現(xiàn)。

http://www.risenshineclean.com/news/51296.html

相關(guān)文章:

  • blogger wordpressseo人員招聘
  • 網(wǎng)站客戶續(xù)費(fèi)北京百度競(jìng)價(jià)托管
  • 沈陽(yáng)建設(shè)企業(yè)網(wǎng)站如何做好網(wǎng)絡(luò)營(yíng)銷(xiāo)
  • 零基礎(chǔ)網(wǎng)站建設(shè)教程seo的基本步驟是什么
  • wordpress 登錄seo外包公司專(zhuān)家
  • 網(wǎng)站策劃內(nèi)容有哪些靠譜的代運(yùn)營(yíng)公司
  • 企業(yè)網(wǎng)站建設(shè)怎么選擇空間百度關(guān)鍵詞優(yōu)化平臺(tái)
  • 網(wǎng)址ip域名解析寧波seo推廣如何收費(fèi)
  • 手機(jī)怎樣做網(wǎng)站圖解品牌推廣軟文200字
  • 跟我一起做網(wǎng)站 下載seo搜索優(yōu)化技術(shù)
  • 網(wǎng)站工作室最牛餐飲營(yíng)銷(xiāo)手段
  • 自己做網(wǎng)站開(kāi)店寧波網(wǎng)站建設(shè)推廣平臺(tái)
  • 安卓做視頻網(wǎng)站微信推廣軟件有哪些
  • 做投資網(wǎng)站深圳seo優(yōu)化公司哪家好
  • 哈爾濱網(wǎng)絡(luò)開(kāi)發(fā)放心網(wǎng)站推廣優(yōu)化咨詢
  • 高校門(mén)戶網(wǎng)站建設(shè)問(wèn)題seo網(wǎng)站關(guān)鍵詞優(yōu)化方式
  • 淘寶上有做網(wǎng)站的嗎某個(gè)網(wǎng)站seo分析實(shí)例
  • 外貿(mào)零售網(wǎng)站建設(shè)查關(guān)鍵詞排名網(wǎng)
  • 玉林市網(wǎng)站開(kāi)發(fā)公司swot分析
  • 網(wǎng)站建設(shè)圖書(shū)百度客服中心人工在線咨詢
  • 改wordpress評(píng)論郵箱willfast優(yōu)化工具下載
  • 做網(wǎng)站外包工作怎么樣360應(yīng)用商店
  • 手機(jī)h5網(wǎng)站模板利于seo的建站系統(tǒng)有哪些
  • 廣東省住房和城鄉(xiāng)建設(shè)局網(wǎng)站投廣告的平臺(tái)有哪些
  • 注冊(cè)公司流程和費(fèi)用需要哪些條件酒店seo是什么意思
  • 網(wǎng)站引導(dǎo)頁(yè)動(dòng)畫(huà)濟(jì)南優(yōu)化網(wǎng)站關(guān)鍵詞
  • 原單手表網(wǎng)站域名解析在線查詢
  • 做類(lèi)似美團(tuán)的網(wǎng)站得多少錢(qián)長(zhǎng)尾關(guān)鍵詞在線查詢
  • 網(wǎng)站語(yǔ)音轉(zhuǎn)寫(xiě)怎么做seo知識(shí)分享
  • 深圳注冊(cè)公司需要什么條件中國(guó)seo網(wǎng)站