go - 如何在golang中将数据结构作为参数传递

标签 go

XML 到 Json

package main

import (
    "encoding/json"
    "encoding/xml"
    "fmt"
)

type Persons struct {
    Person []struct {
        Name string
        Age  int
    }
}
type Places struct {
    Place []struct {
        Name    string
        Country string
    }
}

type Parks struct {
    Park struct {
        Name     []string
        Capacity []int
    }
}

const personXml = `
    <Persons>
        <Person><Name>Koti</Name><Age>30</Age></Person>
        <Person><Name>Kanna</Name><Age>29</Age></Person>
    </Persons>
`

const placeXml = `
    <Places>
        <Place><Name>Chennai</Name><Country>India</Country></Place>
        <Place><Name>London</Name><Country>UK</Country></Place>
    </Places>
`

const parkXml = `
    <Parks>
        <Park><Name>National Park</Name><Capacity>10000</Capacity></Park>
        <Park>Asian Park</Name><Capacity>20000</Capacity></Park>
    </Parks>
`

func WhatIamUsing() {
    var persons Persons
    xml.Unmarshal([]byte(personXml), &persons)
    per, _ := json.Marshal(persons)
    fmt.Printf("%s\n", per)

    var places Places
    xml.Unmarshal([]byte(placeXml), &places)
    pla, _ := json.Marshal(places)
    fmt.Printf("%s\n", pla)

    var parks Parks
    xml.Unmarshal([]byte(parkXml), &parks)
    par, _ := json.Marshal(parks)
    fmt.Printf("%s\n", par)
}

我想要的是一个接受 xml 字符串和 dataStruct 的通用函数 并返回一个 Json 输出。但是下面的函数抛出错误 如何实现?

func Xml2Json(xmlString string, DataStruct interface{}) (jsobj string, err error) {
    var dataStruct DataStruct
    xml.Unmarshal([]byte(personXml), &dataStruct)
    js, _ := json.Marshal(dataStruct)
    return fmt.Sprintf("%s\n", js), nil
}

func main() {
    jsonstring, _ := Xml2Json(personXml, Persons)
}

错误信息:

prog.go:73: DataStruct 不是类型

prog.go:80: 类型 Persons 不是表达式

游戏链接:http://play.golang.org/p/vayb0bawKx

最佳答案

您不能在接口(interface)中存储类型(如 Persons)。您可以将 reflect.Type 传递给您的函数。然后,您的调用看起来像 Xml2Json(personXml, reflect.TypeOf(Persons)),在我看来这很丑陋。

更好的方法可能是:

func Xml2Json(xmlString string, value interface{}) (string, error) {
    if err := xml.Unmarshal([]byte(xmlString), value); err != nil {
        return "", err
    }
    js, err := json.Marshal(value)
    if err != nil {
        return "", err
    }
    return string(js), nil
}

如果您对值本身不感兴趣,可以将此函数与 Xml2Json(personXml, new(Persons)) 一起使用,并且

var persons Persons
Xml2Json(personXML, &persons)

当您还想检索结构值以供以后处理时。

关于go - 如何在golang中将数据结构作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18248898/

相关文章:

multithreading - golang写文件阻塞了很多goroutine,为什么不创建很多线程?

networking - Golang 中的原始套接字嗅探

根据 map[string]somestruct 调用 golang 调度方法

go - 如何在 golang 中记录类型断言错误?

go - package code.google.com/p/go.example/hello : exec: "hg": executable file not found in %PATH%. 如何获取远程golang包?

go - 求一个 big.Int 的平方根

go - 'key, ok := k.(*dns.A)' 在 Go 中是什么意思?

go - Beego/Golang - 查询结构的值

Go 语言字符串常量

intellij-idea - Go 从命令行工作,但不是从 IntelliJ Idea Go