dongqu2863 2017-02-24 23:55
浏览 53
已采纳

如何以通用方式引用嵌套地图

I'm trying to access a nested field like the services key for example from a yaml file I unmarshalled. For what it's worth I don't want to have to build a struct that reflects the structure of the yaml file since it may not always take this form. The yaml file looks like the following:

declared-services:
    Cloudant:
        label: cloudantNoSQLDB
        plan: Lite
applications:
- name: myProject
  memory: 512M
  instances: 1
  random-route: true
  buildpack: java
  services:
  - Cloudant
  timeout: 180
env:
  services_autoconfig_excludes: cloudantNoSQLDB=config

The code looks like this

import "gopkg.in/yaml.v2"

func getManifestConfig() *Manifest {
    wd, _ := os.Getwd()
    manPath := wd + "/JavaProject/" + manifest
    var man map[string]interface{}
    f, err := ioutil.ReadFile(manPath)
    if err != nil {
        e(err) //irrelevant method that prints error messages
    }

    yaml.Unmarshal(f, &man)
    fmt.Println(man["applications"]) //This will print all the contents under applications 
    fmt.Println(man["applications"].(map[string]interface{})["services"]) //panic: interface conversion: interface {} is []interface {}, not map[string]interface {}
    return nil
}
  • 写回答

1条回答 默认 最新

  • dongsu3664 2017-02-25 00:19
    关注

    I think your intent is to use a mapping for applications. If so, delete the "-" following the text "applications:":

    declared-services:
        Cloudant:
            label: cloudantNoSQLDB
            plan: Lite
    applications:
      name: myProject
      memory: 512M
      instances: 1
      random-route: true
      buildpack: java
      services:
      - Cloudant
      timeout: 180
    env:
      services_autoconfig_excludes: cloudantNoSQLDB=config
    

    Access the applications field as a map[interface{}]interface{}:

    fmt.Println(man["applications"].(map[interface{}]interface{})["services"])
    

    A good way to debug issues like this is to print the value with "%#v":

    fmt.Printf("%#v
    ", man["applications"])
    // output with the "-"
    // []interface {}{map[interface {}]interface {}{"buildpack":"java", "services":[]interface {}{"Cloudant"}, "timeout":180, "name":"myProject", "memory":"512M", "instances":1, "random-route":true}}
    
    // output without the "-":
    // map[interface {}]interface {}{"instances":1, "random-route":true, "buildpack":"java", "services":[]interface {}{"Cloudant"}, "timeout":180, "name":"myProject", "memory":"512M"}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 使用Java milo连接Kepserver服务端报错?
  • ¥15 用ADS设计一款的射频功率放大器
  • ¥15 怎么求交点连线的理论解?
  • ¥20 软件开发方法学习来了
  • ¥15 微信小程序商城如何实现多商户收款 平台分润抽成
  • ¥15 HC32L176调试了一个通过TIMER5+DMA驱动WS2812B
  • ¥15 关于自相关函数法和周期图法实现对随机信号的功率谱估计的matlab程序运行的问题,请各位专家解答!