当前位置: 首页 > news >正文

网站定制报价遵义专业网站建设公司电话

网站定制报价,遵义专业网站建设公司电话,建设部网站公示钦州公租房摇号查询,广州注册公司程序在 Go 语言中,匿名字段(也称为嵌入字段)可以用来实现继承的效果。当你在一个结构体中匿名嵌入另一个结构体时,嵌入结构体的方法会被提升到外部结构体中。这意味着你可以直接通过外部结构体调用嵌入结构体的方法。 如果多个嵌入结…

在这里插入图片描述

在 Go 语言中,匿名字段(也称为嵌入字段)可以用来实现继承的效果。当你在一个结构体中匿名嵌入另一个结构体时,嵌入结构体的方法会被提升到外部结构体中。这意味着你可以直接通过外部结构体调用嵌入结构体的方法。

如果多个嵌入结构体实现了同一个接口方法,那么调用时会根据方法的定义顺序来决定调用哪个方法。具体来说,Go 语言会选择第一个定义的方法。

示例

在这里插入图片描述

假设我们有两个结构体 AB,它们都实现了同一个接口 MyInterface,然后我们在结构体 C 中匿名嵌入了这两个结构体。

package mainimport "fmt"// MyInterface 接口
type MyInterface interface {DoSomething()
}// 结构体 A
type A struct{}func (a A) DoSomething() {fmt.Println("A.DoSomething()")
}// 结构体 B
type B struct{}func (b B) DoSomething() {fmt.Println("B.DoSomething()")
}// 结构体 C 匿名嵌入了 A 和 B
type C struct {AB
}func main() {c := C{}var myInterface MyInterface = cmyInterface.DoSomething() // 输出什么?
}

输出结果

在这个例子中,调用 myInterface.DoSomething() 会输出:

A.DoSomething()

解释

在这里插入图片描述

  • 方法提升:当 C 结构体匿名嵌入了 AB 时,AB 的方法都被提升到了 C 中。
  • 方法冲突:由于 AB 都实现了 DoSomething 方法,因此 C 中会有两个同名的方法。
  • 方法选择:在 Go 语言中,当多个嵌入字段中有同名方法时,会优先选择第一个定义的方法。在这个例子中,A 是第一个被嵌入的字段,因此 ADoSomething 方法会被调用。

更多示例

为了进一步说明这一点,我们可以添加更多的嵌入字段来观察方法的选择顺序。

package mainimport "fmt"// MyInterface 接口
type MyInterface interface {DoSomething()
}// 结构体 A
type A struct{}func (a A) DoSomething() {fmt.Println("A.DoSomething()")
}// 结构体 B
type B struct{}func (b B) DoSomething() {fmt.Println("B.DoSomething()")
}// 结构体 D
type D struct{}func (d D) DoSomething() {fmt.Println("D.DoSomething()")
}// 结构体 C 匿名嵌入了 A、B 和 D
type C struct {ABD
}func main() {c := C{}var myInterface MyInterface = cmyInterface.DoSomething() // 输出什么?
}

输出结果

在这个例子中,调用 myInterface.DoSomething() 会输出:

A.DoSomething()

解释

  • 方法提升ABDDoSomething 方法都被提升到了 C 中。
  • 方法选择:由于 A 是第一个被嵌入的字段,因此 ADoSomething 方法会被优先调用。

扩展

当继承类本身也实现了对应方法时,优先使用本身实现的方法


// MyInterface 接口
type MyInterface interface {DoSomething() string
}// 结构体 A
type A struct{}func (a A) DoSomething() string {fmt.Println("A.DoSomething()")return "A"
}// 结构体 B
type B struct{}func (b B) DoSomething() string {fmt.Println("B.DoSomething()")return "B"
}// 结构体 C 匿名嵌入了 A 和 B
type C struct {AB
}func (c C) DoSomething() string {fmt.Println("C.DoSomething()")return "C"
}func TestEnhanceStrcutC(t *testing.T) {var baseC C// 这里将会调用func (c C) DoSomething() stringif "C" != baseC.DoSomething() {t.Error("DoSomething failed.")}
}

总结

在 Go 语言中,当一个结构体匿名嵌入了多个实现相同接口的结构体时,调用该接口方法时会优先选择自己实现的方法,如果自己没有实现该方法,就按照顺序从上到下找到第一个定义的方法。方法的定义顺序决定了调用哪个方法。但是为了避免歧义和提高代码的可读性,建议在设计时尽量避免这种情况,或者在外部结构体中显式地实现接口方法。

http://www.yayakq.cn/news/802189/

相关文章:

  • 万达网站建设潍坊seo招聘
  • 做区块链的网站金属加工网站怎么做
  • 西安市做网站公司有哪些网络营销是网络销售吗?
  • 网站栏目设置说明wordpress 中文用户名
  • 大连做网站排名竞价托管服务多少钱
  • 网站建设有哪些知识点微网站建设使用程序
  • 企业网站要怎么做上海集团平台app
  • 企业网站建设该怎么描述深圳企业名录大全
  • 网站内容策略安卓做网站
  • 沈阳钢结构网架公司做网站如何网站考虑优化
  • 中英文网站用一个域名还是两个域名利于优化建设银行造价咨询中心网站
  • 一个免费的影视网站模板网站域名是不是网址
  • 杭州的互联网企业有哪些视频优化是什么意思
  • 郑州网站建设那家好下载做网站ftp具体步骤
  • 深圳做自适应网站设计网页设计师联盟官网
  • 网站如何绑定二级域名wordpress is single
  • 上海高端模板建站做网站推广的企业
  • 去生活服务性的网站做php好吗kj6699的seo综合查询
  • 网站开发模板系统wordpress cname
  • 利用第三方做网站永久发布地址电子商务平台内经营者享有公平交易的权利
  • 网站设计与网页制作岗位招聘信息物联网平台软件开发
  • 成都大丰网站建设例表网文化馆互联网站建设方案
  • 网站源码免费下载分享论坛给我一个网站好吗
  • 如何查看一个网站是否备案wordpress外链跳转
  • 招聘网站官网seo外链优化方法
  • vs2010做网站施坦威网站关于我们
  • 四平建设局网站火山视窗软件开发平台
  • wordpress开发复杂网站长沙最新招聘
  • 网站建设技术代码做网站需要的照片
  • 织梦网站更改怎么做网站的