我是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张支票吗?
因此,我想知道是否可以使用变量进行接口操作,例如:
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])
}
}
答案 0 :(得分:1)