- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我是 Go 新手,开始学习多态性。
当多个对象需要使用相同的功能时,我知道如何去做。
但是我有一个新问题,如果我在不同的对象上有相同的变量,我不知道该怎么办。
在下面的示例中,我有两个不同的对象:struct1
和 struct2
。它们都有相同的变量name
。
我可以跑过它们并检查哪个是哪个并相应地工作(你可以测试它 here ):
package main
import (
"fmt"
)
type struct1 struct {
name string
}
type struct2 struct {
name string
}
func main(){
structMap := make(map[string]interface{})
s1 := struct1{name:"struct1_name"}
s2 := struct2{name:"struct2_name"}
structMap["struct1"] = s1
structMap["struct2"] = s2
for key, _ := range structMap {
switch key {
case "struct1":
generic := structMap[key].(struct1)
fmt.Println(generic.name)
case "struct2":
generic := structMap[key].(struct2)
fmt.Println(generic.name)
}
}
}
但是如果我有 20 个对象呢?我需要做 20 次检查?
所以我想知道是否可以用变量做一个接口(interface),比如:
type genericStruct interfcae {
name string
}
...
for key, _ := range structMap {
generic := structMap[key].(genericStruct)
fmt.Println(generic.name)
}
当然,这段代码不起作用,因为我不知道该怎么做,但我想知道一种方法。
编辑:
我尝试使用基于以下示例的界面: https://gobyexample.com/interfaces
感谢 Robbie Milejczak 和其他帮助我的人。
这是新的工作代码:
package main
import (
"fmt"
)
type struct1 struct {
name string
}
type struct2 struct {
name string
}
type genericInterface interface {
GetName() string
}
func (r struct1 ) GetName() string{
return r.name
}
func (r struct2 ) GetName() string{
return r.name
}
func printName(g interface{}){
a := g.(genericInterface)
fmt.Println(a.GetName())
}
func main(){
structMap := make(map[string]interface{})
s1 := struct1{name:"struct1_name"}
s2 := struct2{name:"struct2_name"}
structMap["struct1"] = s1
structMap["struct2"] = s2
for key, _ := range structMap {
printName(structMap[key])
}
}
最佳答案
对于这个人为设计的示例,您可以使用 getters/setters 而不是静态属性来利用接口(interface):
type GenericStruct interface {
GetName() string
}
现在任何具有名为 GetName
的接收器的结构都将满足 GenericStruct
接口(interface):
type MyStruct struct {
Name string
}
func (ms *MyStruct) GetName() string {
return ms.Name
}
对于更复杂的结构,这可能会变得困惑,在这种情况下,您可能需要考虑组合建议(通常通过 embedding 实现)或第三方库,例如 genny
关于variables - 如何对变量使用多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58069019/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!