我想做这样的事情:
type Struct1 struct {
var1 int
}
type i interface {
display()
}
func (s Struct1) display() {
fmt.Println(s.var1)
}
func check(i interface{}) {
i.(Struct1).display()
}
func main() {
data := struct {
int
}{
2,
}
check(interface{}(data))
}
我在外部依赖项中有一个函数,该函数接受并返回interface{}类型。该函数类型Assert一个struct(比方说Struct 1)。该struct具有未导出到的字段。我无法创建它的示例以传递给该函数。我知道它具有哪些字段,它们的名称和类型。是否可以发送可以Assert为Struct 1类型的非Struct 1类型的数据。
2条答案
按热度按时间goqiplq21#
你能输入assert一个匿名结构吗?
你当然可以!但是有限制。
以下是一些有用的方法:
1.Assert到匹配的匿名结构:
Playground.
1.Assert到接口:
Playground.
有些事情是行不通的:
1.Assert到来自另一个包的匹配匿名结构,其中包含未导出的字段。
Playground.
fzsnzjdm2#
在特定的情况下,你尝试做的事情是不可能的,即使
Struct1
和匿名结构体有相同的布局,但对于Go语言编译器来说,它们是不同的类型,想想时间,比如Duration,它实际上只是一个int64
,但你不能互换使用它们,这是Go语言故意要做的,其他语言,比如C,允许你进行各种类型的转换和强制类型转换,而且很少会给予编译错误,这是程序员错误的来源,因此Go语言的处理方式有所不同。为了完整起见,仍然可以为您的问题给予一个“解决方案”,下面是一个版本,它使用类似C的不安全强制转换将匿名结构体转换为
Struct1
: