Golang如何从现有结构体创建新结构体
Golang如何从现有结构体创建新结构体 我正在尝试实现一个结构体,该结构体会将多个结构体中的一个传递给一个能将数据转换为XML的函数。一个将字符串传递给xml.Unmarshal()的简单工作示例如预期运行:
func main() {
fmt.Println("hello world")
}
然而,如果我尝试创建一个结构体来"传递"该结构体给函数,结果会得到一个空结构体和不正确的XML:
func main() {
fmt.Println("hello world")
}
我确信我只是遗漏了一些简单的东西,但以我对Go的有限了解,我似乎在解决这个问题上遇到了困难。
谢谢。
更多关于Golang如何从现有结构体创建新结构体的实战教程也可以访问 https://www.itying.com/category-94-b0.html
不幸的是,我需要处理数十个结构体,因此那种方法并不实用。任何涉及类型切换的方案都会变得难以管理。
更多关于Golang如何从现有结构体创建新结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
由于DataStruct是一个空接口,我认为你需要将其转换为特定类型。例如:
data := x.DataStruct.(XmlData)
这样才能解析XML字符串…
问题是我不清楚具体的类型。顺便说一句,那个方法确实有效,但是……当我不清楚具体类型时,获取底层类型的最佳方式是什么?
尝试类似这样的方法:
data, ok := x.DataStruct.(XmlData)
如果类型断言成功,则进行反序列化操作
你好,
正如我之前提到的,虽然这种方法可行,但在实际应用中我无法预知传入的数据类型,而且可能会使用数十种不同的类型。所以如果最终还是要进行类型判断的话,我可能就不需要费心将 DataStruct 定义为接口了。
谢谢。
我放弃了…我尝试了各种方法(肯定漏掉了什么)想让 xml.Unmarshal() 在 interface{} 上正常工作,但都失败了。而且我想不出简单的方法来获取结构体。所以,至少目前我选择使用类型切换,直接实例化结构体而不用反射。
感谢帮助。
也许
t := reflect.TypeOf(x.DataStruct)
switch t.Kind() {
case reflect.Struct:
fmt.Printf("%v\n", t)
data := x.DataStruct.(XmlData)
xml.Unmarshal([]byte(rawXml),&data)
fmt.Printf("The value of data is: %v\n",data)
out, _ := xml.Marshal(data)
fmt.Printf("The value of out is: %s\n",string(out))
}
实际上,我意识到所有 xml.Unmarshal() 和 xml.Marshal() 最终所做的就是先将 XML 字符串转换为结构体,然后再将结构体转换为字节切片。所以从技术上讲,在移除标签之间的多余空格后(我使用换行和制表符格式化 XML 字符串使其更易读),我真正需要做的只是将字符串转换为字节切片,然后…我就不再使用 xml.(Unm/M)arshal 了。
func main() {
fmt.Println("hello world")
}
我无法真正帮助确定使用哪个结构体,因为你基本上必须使用某种 switch 语句。也许你可以添加一个必需字段,比如包含 XML 类型的 tag 字段,但你需要一个虚拟结构体来加载它。至于将结构体传递给另一个函数,你需要创建一个所有结构体都实现的接口。例如 getName xml.Name 和 getValue []string,这样接收函数始终可以获取名称并遍历值。我不确定你最终要实现什么目标,但以下代码可能会激发一些新思路。https://play.golang.org/p/pyrpm0RHSNb
编辑:我想出了一个比使用 switch 语句更好的方法。你可以使用一个映射,其中键是 tag 字段,值是应该用于解组的结构体。类似于 map[string]XmlInterface。这样做意味着你只需要进行一次检查——一个错误检查来查看是否找到了结构体。
func main() {
fmt.Println("hello world")
}


