golang中的扩展方法?

时间:2014-03-03 17:29:39

标签: .net go

我是一个.NET家伙。 Go语言非常新。

在.NET中,我们有扩展方法。 Go中有什么相同的东西吗?

在.NET中我会像bsonTrans["trans.ticket"]

那样

在那个bsonTrans => 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"])

例如在该示例中,我可以执行以下操作:

config [“data.issued”] 哪个应该给出值?

请帮我搞清楚......

实际json: -

(实际的json太大了,不过我提供的样本数量较少。)

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

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

              }
             ]
}

不使用struct 的原因是我的json有太多嵌套结构,我有10个以上不同结构的模式。

所以我遗漏了结构。

我承认我不确定省略结构是最好的方法。

3 个答案:

答案 0 :(得分:10)

扩展方法不像.NET那样支持。

您可以做的最接近的事情是从字符串创建一个类型并在该类型上创建一个方法:

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

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

答案 1 :(得分: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)

}

答案 2 :(得分:-3)

你没有解组成结构的原因不是很好。您故意避免使用核心语言功能而不是定义一些类型的懒惰(实际上,您只需要定义您打算使用的内容),而是宁愿自己随意和不安全地重新实现该功能?

尝试按照原本要使用的方式使用Go。你可能会喜欢它。