2016-06-08 121 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