Golang:将结构转换为偏移量为0的嵌入结构
我有一些不同的结构,比如Golang:将结构转换为偏移量为0的嵌入结构,go,struct,interface,embedding,Go,Struct,Interface,Embedding,我有一些不同的结构,比如Big,在偏移量0处嵌入Small。 我如何从代码中访问Small的结构字段,该代码对Big类型一无所知,但已知Small位于偏移量0处 type Small struct { val int } type Big struct { Small bigval int } var v interface{} = Big{} // here i only know about 'Small' struct and i know that it is
Big
,在偏移量0处嵌入Small
。
我如何从代码中访问Small
的结构字段,该代码对Big
类型一无所知,但已知Small
位于偏移量0处
type Small struct {
val int
}
type Big struct {
Small
bigval int
}
var v interface{} = Big{}
// here i only know about 'Small' struct and i know that it is at the begining of variable
v.(Small).val // compile error
从理论上讲,编译器似乎能够操作这样的表达式,因为它知道Big
type在偏移量0处嵌入了Small
type。有没有办法做这些事情(可能是使用不安全的指针?尽可能避免使用。可以使用反射(包)完成上述任务:
输出(在上尝试):
注意事项:
这适用于任何字段,而不仅仅是第一个字段(位于“偏移量0”)。这也适用于命名字段,而不仅仅是嵌入式字段。不过,这对未报告的字段不起作用。虽然反射式应答可以工作,但它会导致性能下降,而且不适合使用
type Small struct {
val int
}
type Big struct {
Small
bigval int
}
func main() {
var v = Big{Small{10},200}
print(v.val)
}
我认为你应该使用界面。像这样
输出:
Small val: 3
忽略-实际问题不正确,但asker的
v
变量类型为interface{}
,您的变量类型为Big
。为什么不直接转换为Big,然后接受v.val或v.Small.val?“反射在这里太过分了,不是吗?”AlexanderTrakhimenok Asker想找一种我们不知道的方法来处理Big
。转换或提取类型为Big
的值不符合该条件。
type Small struct {
val int
}
type Big struct {
Small
bigval int
}
func main() {
var v = Big{Small{10},200}
print(v.val)
}
package main
import (
"fmt"
)
type MySmall interface {
SmallVal() int
}
type Small struct {
val int
}
func (v Small) SmallVal() int {
return v.val
}
type Big struct {
Small
bigval int
}
func main() {
var v interface{} = Big{Small{val: 3}, 4}
fmt.Printf("Small val: %v", v.(MySmall).SmallVal())
}
Small val: 3