jjzjj

dictionary - 在 map 中存储值和 slice

coder 2024-07-14 原文

如何在 map 中存储既可以是 Type 又可以是 []Type 的值?

我试过这个:

mymap := make(map[string]interface{})
mymap["string"] = "word"
mymap["vector"] = append(mymap["vector"].([]interface{}), "earth")

但是我有一个错误:

panic: interface conversion: interface {} is nil, not []interface {}

这样的 mymap 的目的是将它用于 json.Marshal 以获取 json 对象,如下所示:

{
    "string": "word",
    "vector": [
        "earth",
        "sun"
    ]
}

最佳答案

这会起作用,但您必须始终手动检查该项目是否在 map 中并运行类型断言并对它们采取不同的操作。我建议做一个类型,只使用方法而不是对 map 本身进行操作。

https://play.golang.org/p/e2SFTN70F4v

var ErrNotExists = errors.New("value doesn't exist")
var ErrWrongType = errors.New("variable is wrong type")

type MyMap map[string]interface{}

func(m MyMap) IsArray(key string) bool {
    val, ok := m[key]
    if !ok {
        return false
    }
    _, ok = val.([]string)
    return ok
}

func(m MyMap) Exists(key string) bool {
    _, ok := m[key]
    return ok
}

func(m MyMap) SetString(key, value string) {
    m[key] = value
}

func(m MyMap) SetArray(key string, value []string) {
    m[key] = value
}

func(m MyMap) GetString(key string) (string, error) {
    v, ok := m[key]
    if !ok {
        return "", ErrNotExists
    }
    realVal, ok := v.(string)
    if !ok {
        return "", ErrWrongType
    }
    return realVal, nil
}

func(m MyMap) GetArray(key string) ([]string, error) {
    v, ok := m[key]
    if !ok {
        return nil, ErrNotExists
    }
    realVal, ok := v.([]string)
    if !ok {
        return nil, ErrWrongType
    }
    return realVal, nil
}

func(m MyMap) AppendArray(key string, toAppend []string) error {
    v, ok := m[key]
    if !ok {
        return ErrNotExists
    }
    realVal, ok := v.([]string)
    if !ok {
        return ErrWrongType
    }
    m[key] = append(realVal, toAppend...)
    return nil
}

func main() {
    m := make(MyMap)
    m.SetString("string","hello")
    m.SetArray("array",[]string{"hi","there"})
    fmt.Println(m)
    fmt.Println(m.IsArray("string"), m.IsArray("array"))
    s, err := m.GetString("string")
    if err != nil { // handle
        fmt.Println(err)
    }
    a, err := m.GetArray("array")
    if err != nil { // handle
        fmt.Println(err)
    }
    fmt.Println(s,a)
    m.AppendArray("array", []string{"all","you","people"})
    a, err = m.GetArray("array")
    if err != nil { // handle
        fmt.Println(err)
    }
    fmt.Println(a)
}

关于dictionary - 在 map 中存储值和 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49203308/

有关dictionary - 在 map 中存储值和 slice的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  3. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  4. ruby - 在 ruby​​ 中使用 .try 函数和 .map 函数 - 2

    我需要从json记录中获取一些值并像下面这样提取curr_json_doc['title']['genre'].map{|s|s['name']}.join(',')但对于某些记录,curr_json_doc['title']['genre']可以为空。所以我想对map和join()使用try函数。我试过如下curr_json_doc['title']['genre'].try(:map,{|s|s['name']}).try(:join,(','))但是没用。 最佳答案 你没有正确传递block。block被传递给参数括号外的方法

  5. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  6. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  7. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  8. ruby - 不能将 `each` 的所有或大多数情况替换为 `map` 吗? - 2

    Enumerable#each和Enumerable#map的区别在于返回的是接收者还是映射后的结果。回到接收者是微不足道的,你通常不需要在each之后继续一个方法链,比如each{...}.another_method(我可能没见过这样的案例。即使你想回到接收者那里,你也可以通过tap来实现)。所以我认为所有或者大部分使用Enumerable#each的情况都可以用Enumerable#map代替。我错了吗?如果我是对的,each的目的是什么?map是否比each慢?编辑:我知道当您对返回值不感兴趣时​​使用each是一种常见的做法。我对这种做法是否存在不感兴趣,但感兴趣的是,除了从

  9. ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置 - 2

    对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化

  10. ruby - 如何存储和读取 RubyVM::InstructionSequence? - 2

    有没有办法将RubyVM::InstructionSequence存储到文件中并稍后读取?我尝试了Marshal.dump但没有成功。我收到以下错误:`dump':no_dump_dataisdefinedforclassRubyVM::InstructionSequence(TypeError) 最佳答案 是的,有办法。首先,您需要使InstructionSequence的load方法可访问,默认情况下该方法是禁用的:require'fiddle'classRubyVM::InstructionSequence#RetrieveR

随机推荐