Go 语言中的 map 是不是 用的不多? 相比于 struct?

2021-10-12 15:57:22 +08:00
 chaleaoch
我现在遇到一个需求 返回一个 map, 需要只读. 如果是 python 就简单多了, 深拷贝就可以了.
但是 golang 中似乎没有深拷贝这一说法.
想想也对, map 的 key 和 value 不同, 实际上相当于是不同的类型 . 那么这个深拷贝 函数需要用到反射?

这个功能不是很常见吗? 为什么标准库没考虑写一个呢? 还是我没发现? 还是 map 压根用的就不多?

那 go web 中的 session 是什么结构呢?
1421 次点击
所在节点    Go 编程语言
6 条回复
mason961125
2021-10-12 15:59:25 +08:00
不考虑性能的话,先把结构体序列化,然后再反序列化到 map (非常省事,但是性能极其感人)
chaleaoch
2021-10-12 16:00:33 +08:00
@mason961125 对 这确实一个解决方案我差点就这么干了...
mason961125
2021-10-12 16:04:30 +08:00
@chaleaoch 其实没太理解是什么情况下需要一个 map 而不是序列化后的字节流...?理论上来说 struct 和 map 序列化都的形式都是一样的,所以一般 HTTP API 返回 struct 就够了; gRPC 就完全都是 protobuf 生成的 struct 了,直接返回 map 的情况确实比较少。
chaleaoch
2021-10-12 16:10:03 +08:00
https://github.com/jinzhu/copier 这个玩意好像可以, 实验中...
chaleaoch
2021-10-12 16:13:07 +08:00
@mason961125 我需要一个只读的 session

我从 redis 里读出来的 session 是一个 map 因为 我只负责读, 我不确定 都写了哪些 信息. 所以 session 定义成 map[string]interface

我将这个结构返回给应用但是我并不想应用修改 里面的信息, 或者说我想让他修改了和没修改一样.

从我的方法取出来的 session 永远是一样的.

不知道说解释清楚没.

假设写 session 和 写应用的 是两个人, 那么 写应用的人 也就是 调用 session 的人是不可信的. 所以我想将它变成只读的.
ninerec
2021-10-12 20:29:59 +08:00
希望数据不会被调用方修改
1. 调用方用得更舒适,返回原生的 Map,就得考虑 deep copy,你找到的 https://github.com/jinzhu/copier 很好呢。
2. 做封装,本质是提供不可修改( immutable )的数据,搜了下,https://github.com/benbjohnson/immutable 类似这样即可。

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

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

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

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

© 2021 V2EX