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
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”处)。这也适用于命名字段,而不仅仅是嵌入字段。但是,这不适用于未导出的字段。
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)
}
- 3 回答
- 0 关注
- 139 浏览
添加回答
举报