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 · 3003 次点击
    这是一个创建于 2139 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前写 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   ·   实用小工具   ·   2600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:40 · PVG 09:40 · LAX 17:40 · JFK 20:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.