The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
chaleaoch

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

  •  
  •   chaleaoch · Oct 12, 2021 · 2574 views
  •   You need to sign in to view this topic
    This topic created in 1856 days ago, the information mentioned may be changed or developed.
    我现在遇到一个需求 返回一个 map, 需要只读. 如果是 python 就简单多了, 深拷贝就可以了.
    但是 golang 中似乎没有深拷贝这一说法.
    想想也对, map 的 key 和 value 不同, 实际上相当于是不同的类型 . 那么这个深拷贝 函数需要用到反射?

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

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

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

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

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

    不知道说解释清楚没.

    假设写 session 和 写应用的 是两个人, 那么 写应用的人 也就是 调用 session 的人是不可信的. 所以我想将它变成只读的.
    ninerec
    ninerec
    Oct 12, 2021
    6
    希望数据不会被调用方修改
    1. 调用方用得更舒适,返回原生的 Map,就得考虑 deep copy,你找到的 https://github.com/jinzhu/copier 很好呢。
    2. 做封装,本质是提供不可修改( immutable )的数据,搜了下,https://github.com/benbjohnson/immutable 类似这样即可。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1327 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:57 · PVG 07:57 · LAX 15:57 · JFK 18:57
    ♥ Do have faith in what you're doing.