如下格式的返回码用 Go 应该如何实现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
imherer
V2EX    Go 编程语言

如下格式的返回码用 Go 应该如何实现

  •  
  •   imherer 2019-01-21 19:24:25 +08:00 3361 次点击
    这是一个创建于 2537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前写 Node.js 最近入坑 Go,我在 js 里有如下一个 js 文件用来定义所有 api 的返回结果

    code.js

    module.exports = { SUCCESS: {code: 0, msg: '操作成功'}, FAIL: {code: 100, msg: '未知错误'} // .... 省略 } 

    调用的时候只用code.SUCCESS

    现在用 Go 应该如何定义这个文件呢?

    1.map:取值的话是 map["SUCCESS"] 这样,因为 key 是字符串实际在敲代码的过程中可能会因为 key 拼写错误而导致取不到想要的值

    2.struct:得先定义好所有的 key,但是实例化这个 struct 的时候还得把上面的 key 全部敲一遍,重复的代码量有点大

    各位大佬还有什么更好的办法吗?

    17 条回复    2019-01-22 17:16:23 +08:00
    dabaibai
        1
    dabaibai  
       2019-01-21 19:29:26 +08:00
    可能需要反射??
    iceheart
        2
    iceheart  
       2019-01-21 19:32:06 +08:00 via Android
    go 支持多参返回,不用这玩意儿
    rick12
        3
    rick12  
       2019-01-21 19:33:10 +08:00 via iPhone
    嵌套 struct ?
    imherer
        4
    imherer  
    OP
       2019-01-21 19:34:59 +08:00
    @dabaibai 我去看看反射弧是个什么东西
    imherer
        5
    imherer  
    OP
       2019-01-21 19:37:30 +08:00
    @rick12 对的,struct 是可以实现的,主要是用 struct 话我得这样定义
    ````
    type MainCode struct {
    SUCCESS Detail
    FAIL Detail
    }

    type Detail struct {
    ID int
    Msg string
    }

    var Code MainCode

    func init() {
    Code = MainCode{
    SUCCESS: Detail{100, "未知错误"},
    FAIL: Detail{0, "操作成功"},
    }
    }
    ````
    在 init 里得把所有的 MainCode 里的 key 全部得敲一遍
    目前好像也只能这样了?
    imherer
        6
    imherer  
    OP
       2019-01-21 19:38:48 +08:00
    @iceheart 我知道支持多参返回,我是想把所有可能返回的结果在 code 定义了,不同的 api 返回什么样的状态直接从这个 code 里取
    rick12
        7
    rick12  
       2019-01-21 19:42:43 +08:00 via iPhone
    @imherer 可以定义在一个包里面
    icexin
        8
    icexin  
       2019-01-21 19:48:02 +08:00   1
    var (
    SUCCESS = map[string]interface{}{"code":0, "msg": "操作成功"}
    FAIL = map[string]interface{}{"code":100, "msg": "未知错误"}
    )
    或者定义一个包含 code 和 msg 字段的结构体,SUCCESS 和 FAIL 是对应的实例
    imherer
        9
    imherer  
    OP
       2019-01-21 19:49:30 +08:00
    @icexin 感谢,这个好像是目前最简便的方法
    reus
        10
    reus  
       2019-01-21 20:40:11 +08:00
    我觉得既然都有 SUCCESS、FAIL 了,再引入 0、100 简直多余,直接把 SUCCESS 这个字符串返回给前端不就得了,一目了然,不用再查表

    http 的 1xx 2xx 3xx 4xx 等按照类型分几种都还略好,但仍然是过时的设计
    Trim21
        11
    Trim21  
       2019-01-21 21:30:06 +08:00 via Android
    你再定义一个 success=“ SUCCESS ”算了…
    Mitt
        12
    Mitt  
       2019-01-22 08:45:16 +08:00 via iPhone
    @reus 不过时,真正处理的东西多了就知道为什么要 ode 了
    imherer
        13
    imherer  
    OP
       2019-01-22 10:04:36 +08:00
    @Trim21 这未尝也不是一种办法
    imherer
        14
    imherer  
    OP
       2019-01-22 10:05:45 +08:00
    @reus 这里的 SUCCESS,FAIL 是给后端开发人员看的,code 是 api 说明给出去的
    httpcode 满足不了实际中会遇到的多种情况
    reus
        15
    reus  
       2019-01-22 11:15:14 +08:00
    @Mitt 一个整数和一个字符串没有什么区别,字符串还能一眼看出是什么错误

    @imherer 为什么 api 不用字符串?
    gamexg
        16
    gamexg  
       2019-01-22 16:55:39 +08:00
    @reus #15 code 设置为数字比字符串方便。

    比如 0x1000-0x9999 之间的错误都是需要重新登陆,原因分别是未登录、登陆超时、密码被修改造成登陆失效。前端直接判断在这个范围就显示错误消息并跳转到登录界面。

    有些时候也会按位来提供更详细的信息,不过前端用位标记的不多。
    reus
        17
    reus  
       2019-01-22 17:16:23 +08:00
    @gamexg 这些一样可以用字符串表达
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2184 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 16:05 PVG 00:05 LAX 08:05 JFK 11:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86