登录
首页 >  Golang >  Go问答

使用不同类型的变量来实现多态性

来源:stackoverflow

时间:2024-03-03 22:36:24 300浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《使用不同类型的变量来实现多态性》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

我是 go 新手,开始学习多态性。

我知道当多个对象需要使用同一个函数时该怎么做。

但我有一个新问题,我不知道在不同对象上有相同变量的情况下该怎么办。

在以下示例中,我有两个不同的对象:struct1struct2。它们都有相同的变量 name

我可以运行它们并检查哪个是哪个并相应地工作(您可以在这里测试它):

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])
    }
}

解决方案


对于这个人为的示例,您可以使用 getter / setter 而不是静态属性来利用接口:

type genericstruct interface {
   getname() string
}

现在,任何具有名为 getname 的接收器的结构都将满足 genericstruct 接口:

type MyStruct struct {
  Name string
}

func (ms *MyStruct) GetName() string {
  return ms.Name
}

对于更复杂的结构,这可能会变得混乱,在这种情况下,您可能需要考虑组合建议(通常通过 embedding 实现)或第三方库,例如 genny

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>