Go语言struct与interface及Goland使用技巧

本文介绍了Go语言中struct如何实现interface,包括struct的嵌套、方法重写,并结合Goland编辑器的使用技巧进行说明。在Go语言中,struct必须实现接口的所有方法才能称为实现了该接口,Goland会对此进行标记提示。同时,文章讨论了struct嵌套后的接口实现情况以及方法重写的概念和标志提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发工具:Goland

示例代码

package main

import "fmt"

type Computer interface {
	Calculator
	Play(string) string
}

type Calculator interface {
	Open(string) Calculator
	Say() string
	Add(uint, uint)
	Sum(int, int) int
}

type TOM struct {
	Name string
	Age  int
	Bob  *BOB
}

type BOB struct {
	TOM
	MyName string
}

func (t *TOM) Open(s string) Calculator {
	return t
}

func (t *TOM) Say() string {
	return "I am " + t.Name
}

func (t *TOM) Add(a, b uint) {
	fmt.Println(a + b)
}

func (t *TOM) Sum(a, b int) int {
	return a + b
}

func (t *TOM) Play(s string) string {
	return s
}

func (b *BOB) Say() string {
	return "My Name is " + b.MyName
}

func main() {
	b := new(BOB)
	b.MyName = "Bob"
	t := new(TOM)
	t.Name = "Tom"
	t.Age = 12
	fmt.Println(t.Say())
}

一个struct(结构体)如何实现一个interface(接口)

在Go语言中,一个struct实现了某个接口里的所有方法,叫做这个struct实现了该接口。
比如上面的例子中,接口Calculator中共有四个方法

Open(string) Calculator
Say() string
Add(uint, uint)
Sum(int, int) int

而结构体TOM必须要实现这全部4个方法,才叫做结构体BOB实现了Calculator接口,Alt
在Goland编译器中,如果一个结构体实现了某个接口,这个结构体的源码旁边就会显示接口实现标记,在这里插入图片描述
一个绿底色的?,旁边一个向上的红色箭头↑,点击这个标记,就能看到该结构体实现了哪些类,在这里插入图片描述
如果TOM只实现了三个方法,那TOM就没有实现Calculator接口,而Goland工具上也不会显示这个标记
接口实现标记
而如果一个接口里的【所有方法】,都被某个struct实现了,那么这个接口的源码旁边也同样会被标记,有struct实现了这个接口,
在这里插入图片描述
一个绿底色的?,和一个向下的黑箭头↓,点击这个标志,就能看到哪些struct实现了这个interface,
在这里插入图片描述
然后点击struct,就能查看这些struct的源码定义。

struct(结构体)嵌套

当一个结构体A将另一个结构体B作为其中一个字段时(仅将结构体作为字段;而不是声明一个变量,其类型为结构体B),结构体A就可以直接调用结构体B所绑定的方法,同时也拥有了结构体B中的字段(变量);如果结构体B实现了某个接口E,那么,此时,结构体A也自动实现了接口E
比如上面例子中,结构体TOM是结构体BOB中的一个字段,所以结构体BOB并没有全部绑定接口Calculator中的四个方法,但是可以看到结构体BOB也实现了接口Calculator在这里插入图片描述
不过这里要注意的是,BOBTOM本身作为一个字段,
在这里插入图片描述
而不是定义一个变量,该变量的类型是TOM
在这里插入图片描述
TOM作为变量t的类型,这种情况,结构体BOB就不能直接调用TOM所绑定的方法,结构体BOB也就没有实现接口Calculator在这里插入图片描述
结构体BOB只能调用变量t,然后用变量t来调用TOM所绑定的方法。

方法重写

示例代码
package main

import "fmt"

type TOM struct {
	Name string
	Age  int
	Bob  *BOB
	n    int
}

type BOB struct {
	TOM
	MyName string
}

func (t *TOM) Open(s string)  {
}

func (t *TOM) Say(string) string {
	return "I am " + t.Name
}

func (t *TOM) Add(a, b uint) {
	fmt.Println(a + b)
}

func (t *TOM) Sum(a, b int) int {
	return a + b
}

func (t *TOM) Play(s string) string {
	return s
}

func (b *BOB) Say(string) string {
	return "My Name is " + b.MyName
}

func main() {
	b := new(BOB)
	b.MyName = "Bob"
	fmt.Println(b.n)
	t := new(TOM)
	t.Name = "Tom"
	t.Age = 12
	fmt.Println(t.Say(""))
}

这个例子中结构体BOBTOM本身作为字段的时候,BOB就可以直接调用TOM中所有的变量(包括小写字母开头的私有变量),和所有的方法,我们把这种情况叫做【继承】(暂且叫做继承吧)。
结构体BOB继承了TOM,此时结构体BOB已经可以直接调用TOM绑定的所有方法了,但是BOB自己又绑定了一个与TOM的某个方法的方法名相同、参数相同,返回值类型也相同的一个方法Say(),这种情况,叫做【方法重写】。
意思就是结构体BOB重写了结构体TOM绑定的方法Say(),内部做了与之前TOM所绑定的Say()方法不同的处理。
在Goland编译器中,当一个struct的某个方法被重写的时候,这个方法的旁边会有一个方法重写的提示,
在这里插入图片描述
一个蓝底色的圆圈,和一个向下的黑色箭头,在这里插入图片描述
这个标志,表示该方法被重写,点击这个标志,就可以查看哪个struct重写了该方法,在这里插入图片描述
再点击这个弹出来的struct,就可以看到被重写后的方法,
相应的,如果一个方法重写了某个方法,Goland也会有提示,在这里插入图片描述
一个蓝底色的圆圈,和一个向上的红色箭头↑,在这里插入图片描述
代表该方法重写了另一个方法,点击这个标志,就可以直接跳到原来的方法上
当一个结构体A重写了结构体B的方法,在调用时,结构体A会调用自己所绑定的方法,也就是被A重写后的方法,而结构体B只能调用自己原来的方法,也就是重写前的方法;
不过A也可以调用重写前的方法,但是要通过B来调用,也就是A调用字段B,再调用原来的方法。在这里插入图片描述
可以看到这里的Say()方法是被结构体BOB绑定的,
而在调了TOM后,也可以调用Say()方法,不过此时调用的Say()是被TOM绑定的。
在这里插入图片描述

最后再说说Go语言里面的实现方法,一个结构体要实现一个接口,就要实现这个接口里的所有方法,这里的实现是指,给该结构体绑定与接口里的方法声明完全相同的方法,即方法名相同(包括大小写相同),参数类型和参数个数相同,返回值个数和类型也相同。

☆系统前台简介☆ 1.申请加入免收录网站友情链接网的网站按最后点进的时间排序首页和分类显示链接, 分类以昨日点入时间为准,每晚十二点后生成静态。 2.每来访一个IP,就会自动排到第一(刷新一下),当天来路不同次数,显示颜色也不同:有1次即显示,10次即套蓝色,30次即套红色加粗 3.首页白天3分钟,晚上5分钟自动更新一次,全站24小时手动更新一次。 4.站内搜索功能。 5.网址库中分离出的【名站导航】【实用工具】【友情链接】 ☆系统后台功能☆ 1.设置网站的基本信息。 2.管理员帐号/密码更改。 3.添加删除分类。 4.分类可修改可设置首页是否显示。 5.酷站可设置首页是否显示。 6.添加删除修改网址内容,是否推荐,是否审核。 7.可从网址库中分离出【名站导航】【实用工具】【友情链接】 8.【名站导航】【实用工具】可由快速通道添加。 9.【友情链接】从网址列表中设置。 10.站内搜索功能。 11.生成htm分类页面,生成htm主页及其它页面。 12.可修改主页,分类及其它页面模板。 13.具有数据库【备份】【压缩】【恢复】功能。 14.后台广告位标注 ☆安装使用方法☆ 1.在支持ASP的服务器上解开本软件包。 2.数据库文件在data目录,已经做了防下载处理。 3.后台登录地址在admin/index.asp,默认管理员账号:admin,密码:admin。 4.进入后台根据提示设置你网站的基本信息。 5.生成全站及分类一次。 6.为了安全起见,请在后台将管理员帐号和密码全部修改成你自己的。 后续版本不断更新中......
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值