-
Notifications
You must be signed in to change notification settings - Fork 168
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
value: AnyValue 设计 #120
Comments
关于@longyue0521对提交的code review建议,有这几个点要讨论一下,确定下结论,方便后续及时做调整: |
我的想法是:
|
这里我可以稍微再讨论一下测试模板的问题。实际上我认为划定一个模板是很困难的事情,在 ekit 里面可能就不是特别难。我之前用过很多种写测试的方式:
在第三种形态下,测试看起啦就是: a func() AnyValue 一些特别复杂的,难以创建的实例我也会通过这种形态来测试。所以总的来说我觉得这方面划定一个模板意义不是特别大。而且有些时候我也会觉得这是一个偏好问题 |
另外一个,关于 Convert 类的方法,你们觉得有没有必要支持呢?我对此也是稍微有点犹豫。 |
这个问题都不大 |
1.ok,我改一下位置,起名字是个世纪难题,你们一起看看,哈哈哈... |
是的,有外部依赖的mock场景,多协程场景,未导出场景,确实都属于比较难写单测的场景,比较难统一。但似乎可以给一个参考写法,尽量只聚焦于用例书写,复杂场景就自己对应改一把。 |
如果要参考的话,你就参考已有的写法。这个是我的偏好,也就是不用 args 和 fields 的那种。 Convert 我主要考虑的是允许哪些类型进行转换,以及怎么转换,还有就是要不要考虑溢出问题。例如:
从我个人倾向上来说,我觉得溢出问题可以不校验。但是话又说回来,如果我们不校验,那么大多数用户是没有那个觉悟去校验溢出问题的。 |
嗯嗯,目前测试用例就是去掉了fileds和args。 |
|
目前来看,好像单独一个 value 包没啥意义,因为我们没有别的 value 了,那就放 ekit 下面好了。万一还有别的,我们可以在大版本升级的时候把这个东西挪走。倒也不需要加 To,主要是我们这个没有那种隐含的类型转换之类的,比如说 ConvertXXX 改名叫做 ToXXX 反而比较合适。 那么 ConvertXXX 就将来我们再看了 |
* sqlx 加密列 key长度校验 (#102) * sqlx 加密列 key长度校验 * sqlx 加密列 key长度校验 补单元测试 * 修改加密列key长度错误提示 * atomicx: 泛型封装 atomic.Value (#101) * atomicx: 泛型封装 atomic.Value * 添加 CHANGELOG * syncx/atomicx: 增加 Swap 和 CAS 的泛型包装 * 添加 swap nil 的测试 * 添加更加多的 benchmark 测试,同时保证 NewValue 和 NewValueOf 的语义在 nil 上一致 * 优化单元测试 * queue: API 定义 (#109) * queue: API 定义 * 补充 API 说明 * 实现优先级队列和并发安全优先级队列 (#110) 基于小顶堆和切片的实现 * queue: 延时队列 (#115) * 延迟队列: 优化唤醒入队元素逻辑 (#117) * 修改CHANGELOG链接;添加测试用例修复bug Signed-off-by: longyue0521 <longyueli0521@gmail.com> * 修改cond的SignalCh为signalCh;理清注释 Signed-off-by: longyue0521 <longyueli0521@gmail.com> Signed-off-by: longyue0521 <longyueli0521@gmail.com> * value: AnyValue 设计 (#120) (#121) * value: AnyValue 设计 (#120) * 修复ci检测问题 * 1.fix cr问题 2.add changelog对该pr的引用 3.add license 头部 * 1.修改ChangeLog,加入新特性描述 2.挪出value包,放在根目录 3.统一error格式打印 * 断言方式.Name改为.String Co-authored-by: vividwei <vividwei@tencent.com> * queue: 基于切片的并发阻塞队列和基于 CAS 的并发队列设计 (#119) * queue:使用list包中的LinkedList实现并发阻塞链式队列 (#122) * queue:增加链式并发阻塞队列 Co-authored-by: kangdan <ujn_kangdan@qq.com> Co-authored-by: dan.kang <dan.kang@realai.ai> * ConcurrentLinkBlockingQueue 改成ConcurrentLinkedBlockingQueue (#123) * ConcurrentLinkBlockingQueue 改成ConcurrentLinkedBlockingQueue * modify .CHANGELOG.md * modify .CHANGELOG.md Co-authored-by: kangdan <ujn_kangdan@qq.com> Co-authored-by: dan.kang <dan.kang@realai.ai> * queue: ConcurrentLinkedQueue增加超时控制逻辑 (#124) Co-authored-by: kangdan <ujn_kangdan@qq.com> Co-authored-by: dan.kang <dan.kang@realai.ai> * queue: 添加例子 - 添加队列例子 - 去除 ConcurrentLinkedQueue 的超时机制 * queue: 添加例子 (#126) Signed-off-by: longyue0521 <longyueli0521@gmail.com> Co-authored-by: hookokoko <648646891@qq.com> Co-authored-by: Gevin <flyhigher139@gmail.com> Co-authored-by: Longyue Li <longyueli0521@gmail.com> Co-authored-by: 韦佳栋 <353470469@qq.com> Co-authored-by: vividwei <vividwei@tencent.com> Co-authored-by: kangdan666 <95063166+kangdan6@users.noreply.github.com> Co-authored-by: kangdan <ujn_kangdan@qq.com> Co-authored-by: dan.kang <dan.kang@realai.ai>
仅限中文
使用场景
Go 因为泛型方面以及 error 处理两方面的限制,导致有一些 API 非常难用。举一个例子,在正常的情况下,我们的缓存 API 会设计成:
那么用户在使用的时候,如果想要万无一失使用这个 API,它必须要进行两次检测:
所以我们可以考虑参考类似于 sql.Row 的设计,提供一个已经封装好了的 API : AnyValue
行业分析
可行方案
核心的类型是
这里我设计了两类方法:
除了 int,还要支持以下类型:
其它的 map 和切片,或者数组,因为 Go 类型的限制,我觉得就没有特别强的动力去支持了。
其它
要不要做类型转换
假如说值的真实类型是 int,但是用户要求返回一个 int64,那么按照道理我们可以将 int 转化为 int64 类型
但是如果我们打算支持类型转换,那么我们就需要进一步考虑,string 转基本类型要不要支持?基本类型转 string 类型要不要支持?于是我们就会陷入这种很尴尬的境地,即如果我们要支持类型转化,我们就要考虑这些类型的排列组合。
即便我们要支持,我也倾向于我们提供另外一组方法,以 Convert 为前缀
那么用户就可以知道,这些方法内部是支持类型转化的。这种转化在一个特定的场景下会非常有用:web 等操作 string 类型数据的框架。例如 Redis 的客户端拿到的永远是 string,我们就可以利用这种机制简化代码:
又或者是 Web 的路径参数,Header 的值,查询参数等,都可以利用这种 API 来简化代码
要不要支持特性类型的切片
例如要不要支持 []int, []uint 这种比较常见的切片类型?这个确实是可以考虑支持的,如果不嫌麻烦的话就是可以一起支持了
放在哪个包?
我暂时是想说新开一个 value(x) 的包,放在这里面。另外一个可以考虑的是直接放在顶级目录下。我还在犹豫,这个可以进一步讨论。
你使用的是 ekit 哪个版本?
你设置的的 Go 环境?
The text was updated successfully, but these errors were encountered: