V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dimlau
V2EX  ›  Go 编程语言

请教:远程 Get 到复杂 JSON 极少修改之后传给前端用,怎么做最快捷高效?

  •  
  •   dimlau · 2021-01-11 19:58:47 +08:00 · 2385 次点击
    这是一个创建于 1418 天前的主题,其中的信息可能已经有所发展或是发生改变。
    func GetWM(w http.ResponseWriter, r *http.Request) {
    
    //一写代码
    //省略掉了
    //var TOTID
    //r.Method == "GET"
    
    	w.Header().Set("Content-Type", "application/json")
    	resp, err := http.Get("///xxxxx.json")
    	if err != nil {
    		panic(err)
    	}
    	defer resp.Body.Close()
    	body, _ :=ioutil.ReadAll(resp.Body)
    	addthis := fmt.Sprintf(`{"id":"%s",`,TOTID)
    	body = append([]byte(addthis),body[1:]...)
    	b=string(body)
    	fmt.Fprint(w, b)
    }
    

    这样写是不是很丑?

    16 条回复    2021-01-12 13:38:59 +08:00
    pabupa
        1
    pabupa  
       2021-01-11 20:06:45 +08:00 via Android
    302 ?
    fx
        2
    fx  
       2021-01-11 20:08:09 +08:00
    不用 Golang 最快
    Cuo
        3
    Cuo  
       2021-01-11 20:09:56 +08:00 via iPhone
    不能直接从前段请求吗?
    tcsky
        4
    tcsky  
       2021-01-11 20:30:34 +08:00
    丑没关系, 好用啊.
    有个 sjson 库可以直接改 json 字符串.
    dimlau
        5
    dimlau  
    OP
       2021-01-11 20:31:52 +08:00
    @Cuo
    @fx
    @pabupa

    json 地址里有 md5,而且新加的内容也是 go 从数据库里取出来的……
    所以,如果要是前端做的话,得两次 fetch 。

    请问,各位意思是说,即便这样也比上边那样处理得快吗?
    dimlau
        6
    dimlau  
    OP
       2021-01-11 20:33:03 +08:00
    @tcsky 好嘞,我也去找找看
    neoblackcap
        7
    neoblackcap  
       2021-01-11 22:45:21 +08:00   ❤️ 1
    @dimlau 是不是示例代码漏了一些?我好像没看到有"}"插入进去
    按我的理解,如果仅仅是字符串拼接,不涉及到序列化与反序列化,各种库底层修改的逻辑应该大同小异。最多可能会比你这个高效那么一点,区别应该不大。仅仅是 API 封装了,可能好看一点罢了。
    有的封装还有可能有额外的开销。看你的选择
    jay777
        8
    jay777  
       2021-01-11 22:48:01 +08:00
    sjson gjson
    jinliming2
        9
    jinliming2  
       2021-01-11 22:50:40 +08:00   ❤️ 3
    不要 ioutil.ReadAll,你这个只是把 resp.Body 第一个字节去掉的话,这样写:
    resp, err := http.Get("///xxxxx.json")
    if err != nil {
    panic(err)
    }
    defer resp.Body.Close()
    fmt.Fprintf(w, `{"id":"%s",`, TOTID) // 格式化直接写出
    io.CopyN(ioutil.Discard, resp.Body, 1) // 丢弃第一个字节
    io.Copy(w, resp.Body) // 写出剩余数据
    jinliming2
        10
    jinliming2  
       2021-01-11 22:52:41 +08:00
    @neoblackcap 他 http response 里应该是一个完整的 JSON,{.....},下面他把第一个 { 去掉拼上了前面的那一段,} 是原来的 JSON 里就有的
    neoblackcap
        11
    neoblackcap  
       2021-01-11 22:53:54 +08:00   ❤️ 1
    @jinliming2 哦,你不说我都没搞懂,的确是这样
    treblex
        12
    treblex  
       2021-01-12 09:09:38 +08:00
    如果是 json 的话 写个 struct 绑定 或者绑定 map[string]interface{},然后在修改会方便点吧,
    直接拼字符串是因为有性能要求吗
    hongweiliuruige
        13
    hongweiliuruige  
       2021-01-12 10:19:31 +08:00
    确实丑啊,,
    qq1340691923
        14
    qq1340691923  
       2021-01-12 11:29:21 +08:00
    这种操作就不该 go 来处理,node 做中间层不香吗
    dimlau
        15
    dimlau  
    OP
       2021-01-12 12:07:25 +08:00
    @jinliming2 请问,#9 这样依然还是野路子吗?
    是不是一般不会这样处理?

    因为感觉如 @suke971219 所说写 struct 有点繁琐,用到的数据在 json 的不同层级,struct 要写好几层?
    不如在前端用 js 取想要的就完了。
    jinliming2
        16
    jinliming2  
       2021-01-12 13:38:59 +08:00 via iPhone
    @dimlau 具体情况具体对待。你这个需求里面,resp.Body 完全没用,所以直接流转发就行,效率更高,不需要全读到内存里处理。
    而其他的 xxjson 啦,struct 绑定啦之类的,都是要把整个 json 读到内存里,解析,然后修改,然后序列化,再写出,这个效率就很低了,对你这个需求来说就没有必要了。除非你需要对 resp.Body 做一些额外的处理。
    当然,如果你的 jdon 很小的话,不在乎这点性能,而这样写又不够美观可读的话,那楼上的那些其他的方案也完全可以采用。
    我觉得你这种简单的函数,只要写好注释,基本上没啥问题的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2586 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:35 · PVG 09:35 · LAX 17:35 · JFK 20:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.