登录
首页 >  Golang >  Go问答

Go:强制传递给函数的对象字段?

来源:stackoverflow

时间:2024-03-12 08:09:28 160浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《Go:强制传递给函数的对象字段?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我正在开发一个项目,其中有两个结构,我希望能够对它们执行相同的逻辑,而无需编写两个不同的对象方法,但我不确定如何强制接口的字段。例如,假设我有以下两个结构,其中有许多不同的字段,但它们共享一个字段:

type item1 struct {
    itemfield            string
    ...some other fields
}

type item2 struct {
    itemfield            string
    ...some other fields that differ from those of item1
}

这些项目有几种不同的功能,但有一个共同的功能:

func (item1) itemlogic() {
    --some logic--
}

func (item2) itemlogic() {
    --some different logic--
}

我想将一个函数组合在一起,在处理项目逻辑之前对这些项目进行一些预先检查,但我不想编写两个单独的函数来执行此操作。我可以编写一个接口,以便可以像这样传递 item1 和 item2:

type iitem interface {
    itemlogic()
}

但我不能强制作为函数一部分传入的字段有一个字段 itemfield,这样我就可以编写这样的函数:

func MainFunction(item IItem) {
    if item.ItemField == "..." {
          ....
    }

    item.ItemLogic()
}

这里的问题是理论上我可以传入一个具有 itemlogic 函数但缺少 itemfield 字段的项目,从而导致 nil 指针。有什么我不知道的方法可以强制执行该字段吗?或者,我缺少一些更好的设计吗?我想我可以利用go中的reflect包来检查传入的对象是否具有该字段,但感觉很混乱(我宁愿不允许有人传入坏对象)。有更好的办法吗?


正确答案


您不能在接口上执行字段级操作,因为接口根据定义只是方法集。但是,您可以使用接口来获取 itemfield

type withitemfield interface {
  getitemfield() string
}

并为具有该方法的类型实现 getitemfield 方法。

然后你可以检查一个对象是否有 itemfield:

func MainFunction(item IItem) {
    if withItemField, ok:=item.(WithItemField); ok {
        itemField:=withItemField.GetItemField()
        // validate
    }

    item.ItemLogic()
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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