简单的golang app提供以下错误
.\test.go:13: cannot use ds (type Data_A) as type []interface {} in field value
代码如下
package main
type Data_A struct {
a string
}
type DTResponse struct {
Data []interface{} `json:"data"`
}
func main() {
ds := Data_A{"1"}
dtResp := &DTResponse{ Data:ds}
print(dtResp)
}
我想有一个包含任何类型的slice变量的结构。使用struct{}
会出现同样的错误。
在Java中,我可以使用Object,因为它是任何对象的父对象。但我在golang找不到这样的。
任何帮助都将不胜感激。
答案 0 :(得分:1)
是的,作为interface{}
的切片,可以保存任意值。
var s = []interface{}{1, 2, "three", SomeFunction}
fmt.Printf("Hello, %#v \n", s)
输出:
Hello, []interface {}{1, 2, "three", (func())(0xd4b60)}
https://play.golang.org/p/MQMc689StO
但我不建议以这种方式模拟动态类型语言(如Python,JavaScript,PHP等)。最好使用Go的所有静态类型优势,并将此功能作为最后的手段,或作为用户输入的容器。只是接收它并转换为严格的类型。
答案 1 :(得分:0)
Go是一种强显式类型的语言,因此您无法用另一种类型的对象替换它(它已经以这种方式编译)。此外,当您执行type Data_A struct {...
时,您还可以定义名为Data_A
的新类型。 []interface{}
和Data_A
是完全不同的类型,这些类型(与任何其他类型)不可互换。请注意,即使interface{}
也不能与任何内容互换。您可以在函数func f(a interface{}){...
中传递任何类型,但在函数内部您将具有interface{}
类型,并且应该断言它以便正确使用。
package main
type Data_A struct {
a string
}
type DTResponse struct {
Data Data_A `json:"data"`
}
func main() {
ds := Data_A{"1"}
dtResp := &DTResponse{ Data:ds}
print(dtResp)
}
package main
type DTResponse struct {
Data []interface{} `json:"data"`
}
func main() {
ds := []interface{}{"1"}
dtResp := &DTResponse{ Data:ds}
print(dtResp)
}
可能是混淆的原因:struct不是切片或数组。