V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
chaleaoch
V2EX  ›  Go 编程语言

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

  •  
  •   chaleaoch · 2021-10-12 15:57:22 +08:00 · 1403 次点击
    这是一个创建于 898 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在遇到一个需求 返回一个 map, 需要只读. 如果是 python 就简单多了, 深拷贝就可以了.
    但是 golang 中似乎没有深拷贝这一说法.
    想想也对, map 的 key 和 value 不同, 实际上相当于是不同的类型 . 那么这个深拷贝 函数需要用到反射?

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

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

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

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

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

    不知道说解释清楚没.

    假设写 session 和 写应用的 是两个人, 那么 写应用的人 也就是 调用 session 的人是不可信的. 所以我想将它变成只读的.
    ninerec
        6
    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 类似这样即可。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3514 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:48 · PVG 18:48 · LAX 03:48 · JFK 06:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.