登录
首页 >  Golang >  Go问答

接口的同义结构字段和方法名称

来源:stackoverflow

时间:2024-04-10 20:09:34 330浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《接口的同义结构字段和方法名称》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我正在构建一个代表网络上某些设备的类型结构。这些设备有很多类型,例如:

type foo struct  { ... }
type bar struct  { ... }
type spam struct { ... }

但它们都有一些共同的字段,其中之一是 ip。我想将 device 定义为接口,以便我可以将它们逻辑地分组在一起

type device interface {
    ip() string
    ...
}

type logicalgrouping struct {
    devices []device
    ...
}

但我遇到了名称重叠的错误。

func (f *Foo) IP() string { return f.IP }  // same method name as field name

我可以重命名字段或方法或两者,但这肯定是一个常见的用例——按结构体共有的字段对它们进行分组?这里有惯用的解决方案吗?


解决方案


一般经验法则是接口定义行为,字段定义数据。

这里的问题是您正在使用接口来访问字段中的数据。就其本身而言,这不一定是坏事。但您可能需要重新考虑如何构建代码,以免发生这种冲突。

我要问的第一个问题是:

“如果 struct 定义了可以访问它的 ip() 方法,为什么需要导出字段 ip?”

您可以使结构字段不导出,即 ip 而不是 ip,然后在您使用 struct.ip 的地方,使用 struct.ip() 代替。

第二个问题是:

“如果您有 foobarspam 等结构,并且它们都共享公共字段,为什么不使用组合来删除这些共享字段的重复定义。”

只有当您确实只关注结构内部的数据时,这可能才有效,我通常提倡在所有情况下都使用接口。

如果您有以下结构:

type foo struct {
    ip string
    a string 
    b string
}

type bar struct {
    ip string
    a string 
    b string
}

type spam struct {
    ip string
    a string 
    b string
}

您可以使用一个新的结构来表示它们共有的字段,并在内部匿名地组合该字段:

type Inner struct {
    IP string
    A string 
    B string
}

type Foo struct {
    Inner
}

type Bar struct {
    Inner
}

type Spam struct {
    Inner
}

在使用 struct.ip() 的函数调用中,接受 inner 并使用 struct.inner 调用它。即使 ip 是在 inner 内部定义的,您仍然可以访问 struct.ip

您还可以考虑选择使用 ip 字段和 getipsetip 方法(或 zqbcz) qbip 和 setip 相应于此 doc) - 它是清晰、简洁、简单。

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

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