Go语言中如何通过interface访问对应struct的字段?
Go中访问接口底层结构体字段的方法
Go 中的接口类型仅能调用接口自身声明的方法,无法直接读取实现该接口的结构体的字段,要实现需求可采用以下两种方式:
方式一:使用类型断言
通过类型断言把接口变量转换为对应的具体结构体类型,即可直接访问字段,代码实现如下:
func bar(h Human) { // 断言为person类型,成功则访问对应字段 if p, ok := h.(person); ok { fmt.Println(p.name, "is sent to bar!!") } // 若需要适配secretAgent类型可追加判断 if sa, ok := h.(secretAgent); ok { fmt.Println(sa.name, "is sent to bar!!") } }
如果需要兼容多个实现了Human接口的类型,也可以用type switch(类型开关)简化多分支判断逻辑
方式二:给接口增加Getter方法(更符合Go的惯用写法)
直接在接口定义中补充获取对应字段的方法,所有实现接口的结构体同步实现该Getter方法,调用侧无需做类型判断即可拿到字段值:
首先调整Human接口定义:
type Human interface { speak() GetName() string // 新增获取name字段的方法声明 }
给两个实现结构体补充GetName方法:
func (p person) GetName() string { return p.name } func (sa secretAgent) GetName() string { return sa.name }
修改后的bar函数可直接调用接口方法取值:
func bar(h Human) { fmt.Println(h.GetName(), "is sent to bar!!") }
内容的提问来源于stack exchange,提问作者Mahdi Jedari
相关产品推荐
相关产品推荐

