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

2019-01-21 19:24:25 +08:00
 imherer

之前写 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 全部敲一遍,重复的代码量有点大

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

3021 次点击
所在节点    Go 编程语言
17 条回复
dabaibai
2019-01-21 19:29:26 +08:00
可能需要反射??
iceheart
2019-01-21 19:32:06 +08:00
go 支持多参返回,不用这玩意儿
rick12
2019-01-21 19:33:10 +08:00
嵌套 struct ?
imherer
2019-01-21 19:34:59 +08:00
@dabaibai 我去看看反射弧是个什么东西
imherer
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
2019-01-21 19:38:48 +08:00
@iceheart 我知道支持多参返回,我是想把所有可能返回的结果在 code 定义了,不同的 api 返回什么样的状态直接从这个 code 里取
rick12
2019-01-21 19:42:43 +08:00
@imherer 可以定义在一个包里面
icexin
2019-01-21 19:48:02 +08:00
var (
SUCCESS = map[string]interface{}{"code":0, "msg": "操作成功"}
FAIL = map[string]interface{}{"code":100, "msg": "未知错误"}
)
或者定义一个包含 code 和 msg 字段的结构体,SUCCESS 和 FAIL 是对应的实例
imherer
2019-01-21 19:49:30 +08:00
@icexin 感谢,这个好像是目前最简便的方法
reus
2019-01-21 20:40:11 +08:00
我觉得既然都有 SUCCESS、FAIL 了,再引入 0、100 简直多余,直接把 SUCCESS 这个字符串返回给前端不就得了,一目了然,不用再查表

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

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

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

有些时候也会按位来提供更详细的信息,不过前端用位标记的不多。
reus
2019-01-22 17:16:23 +08:00
@gamexg 这些一样可以用字符串表达

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/529243

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX