2014-03-03 44 views
1

我是一個.NET人。 Go語言非常新穎。golang的擴展方法?

在.NET中我們有擴展方法。 Go有什麼相同之處?

在.NET中,我會不喜歡在bsonTrans =>bsonTrans["trans.ticket"]

BSON文檔

"trans.ticket" => key in json 

    trans is outer level and 

    ticket is inner level 

我使用MongoDB的本地驅動程序。在那我添加我的擴展功能來執行這些操作。

就像聰明的第n級我做了.NET。

我想在Go中應用相同的邏輯。

b := []byte(trans) 
var config map[string]interface{} 
err := json.Unmarshal(b, &config) 

fmt.Println(config["data"].(map[string] interface{})["issued"]) 

例如,在這個例子中,我可以這樣做:

配置[ 「data.issued」]應該回報給價值?

請幫我搞清楚了這一點......

實際JSON: -

(實際JSON是太大了,但是我提供的是用更少的字段的樣本)

{ 
"_id" : 2001, 
    "address" : { 
     "line1" : "", 
     "line2" : "", 
     "line3" : "" 
     }, 
    "tickets" : [ 
     { 
      "seq" : 2, 
      "add" : [ 
       { 
       "seq" : "", 
       "amnt" : 50 
       }, 

       { 
       "seq" : "", 
       "amnt" : 50 
       { 
       "seq" : "", 
       "amnt" : 50 
       } 
       } 

       } 
      ] 
} 

理由不使用結構是我的JSON有太多的嵌套結構,我有10點以上的模式有不同的結構。

因此,我遺漏了結構。

我承認我不確定省略結構是否是最好的方法。

+2

你可以發表你的JSON的實際樣品?我可以告訴你它是如何工作的。另外,是否有一個原因,你不想使用一個正式的結構來編組數據而不是通用映射[string] interface {}?雖然後者會工作,但我傾向於使用實際定義良好的結構來編組。 –

回答

6

擴展方法不支持它在.NET的方式。

你可以做的最接近的事是從字符串創建一個類型,並創建該類型的方法:

type MyString string 
func (m *MyString) Method() { 
} 

func main() { 
    var s MyString = "" 
    s.Method() 
} 
+0

關於「類型MyString字符串」...有沒有一種方法來將字符串轉換爲MyString沒有附加的輔助函數或以其他方式到MyString? Will Interface {}甚至會這樣做,或者會在運行時拋出一個反射錯誤? – steviesama

-3

你不把Unmarshalling結構化爲結構的原因是不好的。由於懶惰定義了一些類型(事實上,你只需要定義你打算使用的內容),你故意避免使用核心語言功能,而寧願基本上自己重新實現這些功能。

嘗試使用Go的方式來使用。你可能會喜歡它。

+0

他可能從第三方接收json,所以他的理由似乎完全有效。 – ostati

1

以下是使用您的json的代碼示例。你的json樣本無效,所以我將其糾正爲我認爲你的意圖。

我想你會發現使用帶深度嵌套結構的map [string] interface {}將無法工作,但我不知道你的用例,所以我不能肯定地說。

下面是實際運行的代碼,以及一個互動的環節:http://play.golang.org/p/0gtYMfBMWX

package main 

import "fmt" 
import "encoding/json" 

func main() { 
    b := []byte(`{ 
    "tickets": [ 
    { 
     "add": [ 
     { 
      "amnt": 50, 
      "seq": "" 
     }, 
     { 
      "amnt": 50, 
      "seq": "" 
     }, 
     { 
      "amnt": 50, 
      "seq": "" 
     } 
     ], 
     "seq": 2 
    } 
    ], 
    "address": { 
    "line3": "", 
    "line2": "", 
    "line1": "" 
    }, 
    "_id": 2001 
}`) 
    var config map[string]interface{} 
    if err := json.Unmarshal(b, &config); err != nil { 
    fmt.Printf("Error: %s", err) 
    return 
    } 

    // I'm not sure what part of the data you are trying to get at here... 
    //fmt.Println(config["data"].(map[string]interface{})["issued"]) 

    fmt.Printf("%v\n\n", config) 

    tickets := config["tickets"] 
    fmt.Printf("%v\n\n", tickets) 

}