当前位置: 首页 > news >正文

网站开发的时间流程宁德市有几个区几个县

网站开发的时间流程,宁德市有几个区几个县,桂林互联网企业,厦门网站排名优化价格1. 前言 之前在设计一个兼容函数的时候#xff0c;使用了sjson动态设入参数#xff0c;从而实现一些参数的兼容。大致的逻辑如下所示#xff1a; // 有一堆不规则的json数据 {a:aaa,b:bbb,any_key1:{k…1. 前言 之前在设计一个兼容函数的时候使用了sjson动态设入参数从而实现一些参数的兼容。大致的逻辑如下所示 // 有一堆不规则的json数据 {a:aaa,b:bbb,any_key1:{key:value},any_key2:{key:value} } // 因为any_key1和any_key2这样的数字字符串的key还会有新增所以这个是无法固定的没有办法给到一个具体的结构体解析于是就人为的兼容给它们在处理的时候包一个外层的key {a:aaa,b:bbb,number_key_data:{any_key1:{key:value},any_key2:{key:value}} } // 这样处理之后我只要定义number_key_data我就可以获取到具体的字符串数字为key的数据2. 实现 采用sjson对对应的非特定key进行新的结构值设入然后做一个兼容即可实现上面的逻辑于是有这段代码出来了。 package gjson_set_studyimport (encoding/jsonfmtgithub.com/tidwall/sjsontesting )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:aB string json:bNumberKeyData map[string]struct {Key string json:keyValue 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 }上面的实现不出意外的话是不会有任何的问题但是不出意外的意外出现了当类似的逻辑代码上线之后我们发现一个问题容器会爆内存。这代码也实现了自测也过了QA的测试为什么会突然爆内存呢 3. 问题 容器爆内存的问题出现了但并不是所有的数据都爆内存有一组数据100%会爆内存它们的数据类似 {a:aaa,b:bbb,1000000:{key:value},50000000:{key:value}}比较明显的是出现了数字字符串的key然后结合代码看了一下刚开始也没看出啥异常觉得这个修改后的数据应该是 {a:aaa,b:bbb,number_key_data:{1000000:{key:value},50000000:{key:value}}}但后面发现爆内存的问题又想起了设置数组的方式当前的代码逻辑如果遇到数字key就会被认为是在设置数组开辟几百万甚至上千万长度的数组(细思极恐) 于是就发现了爆内存的问题所在数字key在未经特殊标识的情况下会被认定为数组于是这个设置key的过程就变成了对一个key的长为1000000的数组设置值(后者是50000000)可怕。 4. 解决方法 于是参看源码照着sjson的set方法一路向下看可以发现如果在parsePath 中我们对路径添加了: 的前缀sjson会强制把这个key当做string key而在atoui中不会将其解析为一个具体的数字进而导致对字符串key的设置变成对数组的设值。 func parsePath(path string) (res pathResult, simple bool) {var r pathResultif len(path) 0 path[0] : { // 如果含有:符号这个key会被强制认定为keyr.force truepath path[1:]}for i : 0; i len(path); i { // 对path进行分解if path[i] . {r.part path[:i]r.gpart path[:i]r.path path[i1:]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的前缀都加上:的标识。 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}}} nil5. 小结 忽然想到遇到的这个小问题当时就觉得还是自己单测的场景不够全面导致了这次爆内存的问题发生还好有临时解决方案不然对线上服务造成的影响还真不小。通过这个事例再一次告诫自己在后续的代码编写中对于通用功能的逻辑代码要尽可能的思考一些边缘case从而避免在上线后边缘case导致代码崩溃的现象出现。
http://www.w-s-a.com/news/863737/

相关文章:

  • 楚雄 网站建设广告设计一般人能学吗
  • 热搜榜排名前十山东seo多少钱
  • 衡水哪有建网站的吗企业信息系统英文
  • 有模板怎么建站wordpress媒体库图片路径
  • 怎么做网站h汉狮企业网站营销的实现方式
  • 新津县建设局网站怎么做区块链网站
  • 网站设计与制作是什么专业广州优化网站
  • 腾讯有做淘宝客网站吗网站开发包
  • 网站整体营销方案网站建设百度贴吧
  • 宣传式网站养生网站模板
  • 临猗网站建设天津做网站哪家服务好
  • 郑州做网站九零后用织梦建设网站的步骤
  • 莱芜网站优化加徽信xiala5江都网站制作
  • 网站开发工具书焦作网站开发公司电话
  • 石狮网站建设报价百度爱采购怎么优化排名
  • 广州网站开发系统如何建设百度网站
  • 免费建立一个个人网站网站流量图怎么做
  • 微信网站建设公司首选网站后台更新 前台不显示
  • 撰写网站专题活动策划方案未成年做网站
  • 免费在线响应式网站自助建站网页设计与网站建设试卷
  • 四川省肿瘤医院搜索优化整站优化
  • 新钥匙建站深圳创业补贴政策2023
  • 建网站需要准备什么网站三个月没排名
  • 网站运营规划网站推广的手段
  • cvm可以做网站服务器吗网片围栏
  • 培训前端网站开发网站开发 群
  • 成都武侯区网站建设wordpress菜单分类目录
  • 牡丹江市西安区建设局网站给公司做的东西放到自己网站上
  • 做网站的前景如何郑州seo规则
  • 学校户网站建设方案专业设计服务