在golang中,具有任何类型的切片变量的struct是可能的吗?

时间:2017-11-22 05:36:34

标签: go

简单的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找不到这样的。

任何帮助都将不胜感激。

2 个答案:

答案 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{}类型,并且应该断言它以便正确使用。

修正#1

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)
}

修正#2

package main

type DTResponse struct {
    Data []interface{} `json:"data"`
}

func main() {
    ds := []interface{}{"1"}
    dtResp := &DTResponse{ Data:ds}

    print(dtResp)
}

可能是混淆的原因:struct不是切片或数组。