Go语言中接口interface(多接口,空接口,类别开关)的应用
创始人
2024-03-21 10:46:54
0

接口是一组方法签名的集合,然后我们可以定义一个结构体struct来实现该接口的所有方法,这样来看,接口就定义了对象的行为。
对于接口大家都有着一定的了解,需要注意的就是实现接口,那就必须实现它里面的所有方法。

我们定义一个形状Shape的接口,里面声明了周长与面积的两个方法,然后定义矩形Rectangle与圆形Circular的结构体类型,通过这个类型实现这些方法,由于方法都已在接口里面声明,所以矩形与圆形的类型也就实现了形状Shape接口。

接口的实现

package mainimport ("fmt""math"
)// 形状接口,声明周长与面积方法
type Shape interface {Perimeter() float64Area() float64
}// 矩形结构体:宽度与高度
type Rectangle struct {Width  float64Height float64
}// 圆结构体:半径
type Circular struct {Radius float64
}// Rectangle实现周长的方法
func (R Rectangle) Perimeter() float64 {return (R.Width + R.Height) * 2
}// Rectangle实现面积的方法
func (R Rectangle) Area() float64 {return R.Width * R.Height
}// Circular实现周长的方法
func (C Circular) Perimeter() float64 {return math.Pi * (C.Radius * 2)
}// Circular实现面积的方法
func (C Circular) Area() float64 {return math.Pi * (C.Radius * C.Radius)
}
func main() {var shape Shape = Rectangle{4.5, 5}fmt.Printf("%T,%#v,%#v\n", shape, shape.Perimeter(), shape.Area()) //main.Rectangle,19,22.5var shape2 Shape = Circular{6}fmt.Printf("%T,%.2f,%.2f", shape2, shape2.Perimeter(), shape2.Area())//main.Circular,37.70,113.10
}

从结果也看出这个类型是可以赋值给接口,赋值的类型不一样,其接口类型也跟着发生变化。就是说什么类型的赋值,接口就会成为这个具体的类型。

参数是空接口

空接口也就是说里面没有声明方法,啥都没有,我们来看下空接口作为方法参数的一个例子:

package mainimport ("fmt"
)type GetInfo stringtype Person struct {Name stringAge  int
}// 空接口做参数
func test(i interface{}) {fmt.Printf("%T,%#v\n", i, i)
}
func main() {getinfo := GetInfo("寅恪光潜")person := Person{"Tony", 18}test(getinfo) //main.GetInfo,"寅恪光潜"test(person)  //main.Person,main.Person{Name:"Tony", Age:18}
}

我们可以看出test方法里面的参数是空接口,可以接收任意类型的参数,因为所有类型本已都实现了空接口。
结果也正确显示了参数进来的类型与值,再次证明了上面接口的类型也是随着具体类型变化而变化的。

多接口的实现

想要实现多接口,其实跟实现一个接口类似,只不过多个接口里的方法都一一实现,既然方法都已实现,这样也就实现了多接口。
我们定义两个形状接口,一个包含计算面积的方法,另一个包含计算体积的方法。然后我们分别将正方体类型赋值给这两个接口

package mainimport "fmt"type Shape1 interface {Area() float64
}
type Shape2 interface {Volume() float64
}// 正方体结构体:边长
type Cube struct {Edge float64
}// 面积
func (C Cube) Area() float64 {return 6 * C.Edge * C.Edge
}// 体积
func (C Cube) Volume() float64 {return C.Edge * C.Edge * C.Edge
}func main() {C := Cube{4}var S1 Shape1 = Cvar S2 Shape2 = Cfmt.Printf("%#v\n", S1.Area()) //96fmt.Printf("%#v", S2.Volume()) //64
}

因为正方体Cube实现了面积与体积的方法,也就是这两个接口里的方法都实现了,所以就实现了两个接口。
如果S1.Area() 换成 S1.Volume()会报错:

Build Error: go build -o c:\Users\Tony\__debug_bin.exe -gcflags all=-N -l .
# _/c_/Users/Tony
.\test.go:30:25: S1.Volume undefined (type Shape1 has no field or method Volume) (exit status 2)

因为这个S1接口里面是面积的方法,没有体积的方法,所以编译的时候就会报错。
那既然是实现了多接口,那想要调用另外接口的方法,该如何处理呢?
将用到类型的断言。类型断言的语法为:i.(Type)

func main() {var S1 Shape1 = Cube{4}c := S1.(Cube)fmt.Println(c.Area())   //96fmt.Println(c.Volume()) //64
}

这样就可以分别去调用两个接口里面的方法了。
当然了,这个类型是需要实现接口的,如果没有实现会报错,所以最好是有一种判断来处理。

s1, ok := S1.(Cube)
fmt.Println(s1, ok)//{4} true

通过这个ok值来判断,为true就是实现了这个接口。

type Tony interface {Sing() string
}
s2, ok2 := S1.(Tony)
fmt.Println(s2, ok2)// false

由于Cube没有实现Sing方法,也就是没有实现Tony接口,所以第二个返回值就是false

类型开关

通过上面的学习,我们又回到上面的空接口的示例,针对输入的类型分别做判断:

代码如下:

package mainimport ("fmt""strings"
)type Person struct {Name stringAge  int
}// 空接口参数
func test(i interface{}) {switch i.(type) {case string:fmt.Printf("%#v\n", strings.ToUpper(i.(string)))case int:fmt.Printf("%#v\n", i)default:fmt.Printf("%T,%v", i, i)}
}
func main() {person := Person{"Tony", 18}test("hello")test(110)test(person)
}
/*
"HELLO"
110
main.Person,{Tony 18}
*/

相关内容

热门资讯

探秘位于福州新区的机器人训练场... □“医疗场景人形机器人训练场启动”追踪记者探秘位于福州新区的机器人训练场人形医疗机器人这样“岗前培训...
发展农产品精深加工 加快推进乡... 转自:黄石发布9日,市委副书记、市长吴之凌赴大冶市调研农业产业化工作。他强调,要深入学习贯彻习近平总...
巴基斯坦空袭印度多地空军基地,... 转自:北京日报客户端5月10日,巴基斯坦军方消息人士称,巴基斯坦空军战斗机正在对印度古吉拉特邦、安巴...
最新!巴基斯坦对印度发起网络攻... 每经编辑|杜宇 据央视新闻,从印度方面获悉,当地时间5月10日早上6时左右,印控克...
新华社评论员:推动中俄关系迈向... 5月的莫斯科天高云阔,在这“梨花开遍了天涯”的季节,国家主席习近平对俄罗斯进行国事访问并出席纪念苏联...
巴基斯坦对印度发起网络攻击 致...   5月10日,据巴基斯坦军方消息人士称,在该国发起的“铜墙铁壁”军事行动中,巴对印度发动网络攻击,...
长沙10岁女生好样的!“国象小... 在近日落幕的巴库国际象棋公开赛中,中国棋手、长沙10岁女生杨又晴勇夺10岁以下组女子冠军。杨又晴巴库...
新华社经济随笔:“一张手机膜”... 转自:新华社新华社北京5月9日电 题:新华社经济随笔:“一张手机膜”畅销海内外的启示新华社记者张辛欣...
上海举办“5·12”防灾减灾主... 东方网5月9日消息:今年5月12日是第17个全国防灾减灾日,主题为“人人讲安全、个个会应急——排查身...
巴基斯坦称对印精准打击造成设施... 转自:北京日报客户端当地时间10日,总台记者获悉,巴基斯坦军方消息人士表示,巴基斯坦“铜墙铁壁”行动...
邯郸道 天使情——邯郸市中心医... 转自:邯郸网络广播电视台编者按:在国际护士节来临之际,邯郸市中心医院以“邯郸道 天使情”为主题,开展...
打破偏见,法国启动“女孩与数学... 来源:环球时报 据法国电视新闻网7日报道,法国教育部长博尔内近日表示,为了加强女性在“工程和数字领域...
2025年是AI智能体规模应用... 来源:@经济观察报微博经观智家 2025年,AI领域的热议话题已经从大语言模型(LLMs)转向了AI...
冯德莱恩表态贸易谈判前不见特朗... 欧盟委员会主席冯德莱恩当地时间9日在布鲁塞尔表示,在欧美能够进行具体的贸易谈判之前,她不会前往华盛顿...
斯凯奇650亿收购案背后,神秘... 文|胖鲸头条 Jolene Chen近日,美国运动品牌斯凯奇(Skechers)以94亿美元(约合人...
国家统计局:今年4月份CPI环... 国家统计局发布2025年4月份CPI和PPI数据。2025年4月份CPI环比由降转涨,核心CPI涨幅...
汇添富中证信息技术应用创新产业... 5月10日,汇添富中证信息技术应用创新产业ETF公告称,基金经理乐无穹不再管理汇添富中证信息技术应用...
2025年4月份工业生产者出厂... 格隆汇5月10日|2025年4月份,全国工业生产者出厂价格同比下降2.7%,环比下降0.4%;工业生...
快讯:“巴基斯坦对新德里附近目... 据沙特阿拉伯卫星电视台、哈达斯电视台(Al-Hadath)当地时间10日援引消息人士的话披露,印度和...
安农大团队发现茶叶鲜味流失奥秘 转自:安徽新闻网本网讯(记者 陈婉婉)清明节前采摘制作的绿茶俗称明前茶,带着一股令人陶醉的鲜爽,但到...