登录
首页 >  Golang >  Go问答

处理Go接口的重复性和灵活性的方法是什么?

来源:stackoverflow

时间:2024-02-15 10:51:23 384浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《处理Go接口的重复性和灵活性的方法是什么?》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我有一个使用如下结构的项目:

type I interface {
  GetName() string
  DoSomething()
}

//
// A implements I
//
type A struct {
    Name  string
}

func (a *A) GetName() string {
  return a.Name
}

func (a *A) DoSomething() {
  ...do something
}

//
// B implements I
//
type B struct {
    Name  string
}

func (b *B) GetName() string {
  return b.Name
}

func (b *B) DoSomething() {
  ...do something
}

func (b *B) DoSomethingElse() {
  ...do something else
}

//
// Both
//
func UseAorB(T I) {
  name := T.GetName()...
}
  1. 在采用接口 i 的函数中调用时,使用 getname 是从结构 a 或 b 获取名称字段的最佳方式吗?
  2. 每次要实现接口时,我都必须重新定义 dosomething 吗?或者如果 dosomething 每次都相同并且我可以只定义一次,是否有更好的方法来做到这一点?
  3. 结构 b 有一个接口未定义的方法 (dosomethingelse)。我是否需要使用 reflect 才能将 struct b 传递给采用接口 i 来调用 dosomethingelse 的函数?或者我应该定义一个包含此方法的新接口?

我想提高我的代码质量并编写一个可靠的库,但我不得不说,这感觉就像我在与语言作斗争,让我的生活变得更加困难。


正确答案


  1. 是的,getname() 是一个很好的方法

  2. 如果您有类似的方法实现,通常可以将其移至通用结构并嵌入:

    type common struct {}
    
    func (c common) dosomething() {...}
    
    type a struct {
       common
       stuff
    }
    
    type b struct {
       common
       other stuff
    }

    上面,ab 都有 dosomething 方法,并且它们共享实现

  3. 不要使用反射。有两种方法:

    1. 使用类型断言:

      func f(in i) {
         if b, ok:=in.(b); ok {
            // b is of type b, so:
            b.dosomethingelse()
         }
      }
    1. 使用接口和类型断言:

      type DoesSometingElse interface {
         DoSomethingElse()
      }
      
      func f(in I) {
         if x, ok:=in.(DoesSomethingElse); ok{
            x.DoSomethingElse()
         }
      }

如果您感觉自己正在与该语言作斗争,那么要么您的建模不正确,要么您不知道用该语言做某事的正确方法。所有语言都有好的和坏的做事方式,而且很多时候每种语言的做事方式都是不同的。如果您从另一种语言转向 go,您应该首先停止尝试用另一种语言思考并翻译成 go,并尝试单独使用 go。

本篇关于《处理Go接口的重复性和灵活性的方法是什么?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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