2016-06-08 46 views
0

我需要在我的代码中内部维护一些数据:一个ID嵌套深度较深的级别,在提供父级道具的名称时要进行访问。如果在JavaScript编写例如,我会做一些事情,如:在Go使用结构中存储/访问嵌套数据?

var data = { 
    1111: { 
     la1: { 
      lb1: 1343584765, 
      lb2: 1545438458 
     }, 
     la2: { 
      lb1: 1263268535, 
      lb2: 1468904679 
     } 
    }, 
    2222: { 
     la1: { 
      lb1: 1645078365, 
      lb2: 1457732458 
     }, 
     la2: { 
      lb1: 1682974682, 
      lb2: 1782975685 
     } 
    } 
} 

,然后访问这样的(是顶道具必须是一个int):

data[1111]['la1']['la2'] //gets 1343584765 

,但我不能看看如何用Go结构来构建这个结构,而且我阅读的大部分内容都建议不要这样做。唯一的其他办法,我可以看到的是去使用这个逻辑,但感觉凌乱,这可能会变得越来越大,因此难以维持:

func getVal(
    varA int, 
    varB string, 
    varC string, 
) int { 
    if varA == 1111 { 
     if varB == "la1" { 
      if varC == "lb1" { 
       return 1343584765 
      } 
      if varC == "lb2" { 
       return 1545438458 
      } 
     } 
     if varB == "la2" { 
      if varC == "lb1" { 
       return 1263268535 
      } 
      if varC == "lb2" { 
       return 1468904679 
      } 
     } 
    } 
    if varA == 2222 { 
    ....etc 

,然后用访问:

getVal(1111, "la1", "lb1") //gets 1343584765 

大感谢任何能够帮助我的人!

+0

什么是你的围棋数据结构是什么样子? –

+0

另外,是1111,la1,lb1等有意义的硬编码属性。或者你是否更喜欢(伪代码)Map(int,Map(string,Map(string,int))'。奇怪的结构,可能与我们分享你想达到的目标。 –

+0

@NathanCooper这就是我的问题。我会用什么样的数据结构来替换Go'if'逻辑,我在'getVal'中使用? – tripRev

回答

3

解决问题的方法非常奇特。也许你已经知道这一点,但是你不会这样做:use maps

我做了一个严重命名类型的例子(因为我不知道你的用例),我也把所有东西都做成了一个字符串来保持简单。

type l3Map map[string]string 
type l2Map map[string]l3Map 
type l1Map map[string]l2Map 

func main() { 

    data := l1Map{ 
     "1111": l2Map{ 
      "la1": l3Map{ 
       "lb1": "1343584765", 
       "lb2": "1545438458", 
      }, 
     }, 
    } 

    fmt.Printf("%v\n", data["1111"]["la1"]["lb2"]) 
} 

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