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