为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:将结构转换为嵌入在偏移量 0 的结构

Golang:将结构转换为嵌入在偏移量 0 的结构

Go
MYYA 2022-03-03 16:01:42
我有一些不同的结构,例如在偏移量 0Big处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 variablev.(Small).val // compile error似乎编译器理论上能够操作这样的表达式,因为它知道Big类型Small在偏移量 0 处嵌入了类型。有没有办法做这样的事情(也许用unsafe.Pointer)?
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

虽然用反射回答是有效的,但它有性能损失并且对 Go 来说不是惯用的。


我相信你应该使用界面。像这样


https://play.golang.org/p/OG1MPHjDlQ


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


查看完整回答
反对 回复 2022-03-03
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

unsafe尽可能避免使用。上述任务可以使用反射(reflect包)完成:


var v interface{} = Big{Small{1}, 2}


rf := reflect.ValueOf(v)

s := rf.FieldByName("Small").Interface()


fmt.Printf("%#v\n", s)

fmt.Printf("%#v\n", s.(Small).val)

输出(在Go Playground上试试):


main.Small{val:1}

1

笔记:


这适用于任何字段,而不仅仅是第一个字段(在“偏移量 0”处)。这也适用于命名字段,而不仅仅是嵌入字段。但是,这不适用于未导出的字段。


查看完整回答
反对 回复 2022-03-03
?
HUWWW

TA贡献1874条经验 获得超12个赞

type Small struct {

    val int

}


type Big struct {

    Small

    bigval int

}


func main() {

    var v = Big{Small{10},200}

    print(v.val)

}


查看完整回答
反对 回复 2022-03-03
  • 3 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信