关于 golang 的接口介绍

发布时间:2024-02-06 点击:103
下面由golang教程栏目给大家介绍关于 golang 的接口,希望对需要的朋友有所帮助!
在go语言中接口(interface)是一种类型,一种抽象的类型。
接口的定义
定义格式:
type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 …}go语言的接口在命名时,一般会在单词后面添加er,接口名最好要能突出该接口的类型含义。
接口实现
一个对象只要全部实现了接口中的方法,那么就实现了这个接口。
go语言中不同的类型可以实现同一个接口。(示例中dog和cat都实现了animal接口)
//定义一个animal接口// animal 是一个动物接口,实现move()和say()方法type animal interface { move() say()}//定义dog结构体type dog struct { name string}//定义cat结构体type cat struct { name string}//dog实现move方法func (d dog) move() { fmt.printf("%s%u4f1a跑\\\\n",d.name)}//dog实现say方法func (d dog) say() { fmt.printf("%s%u4f1a叫汪汪汪\\\\n",d.name)}//cat实现move方法func (c *cat) move() { fmt.printf("%s%u4f1a跑\\\\n",c.name)}//cat实现say方法func (c cat) say() { fmt.printf("%s%u4f1a叫喵喵喵\\\\n",c.name)}func main() { var a animal //声明一个animal类型的a //实例化一个dog结构体 d := dog{name:"旺财"} fmt.printf("%t\\\\n", d) //main.dog d.move() //旺财会跑 d.say() //旺财会叫汪汪汪 a = d // 接口是一种类型,一种抽象的类型。 fmt.println(a) //{旺财} //实例化一个cat结构体 c := cat{name:"蓝猫"} c.move() //蓝猫会跑 c.say() //蓝猫会叫喵喵喵}多态
go语言通过接口模拟多态。
类型与接口关系
一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。
go语言中不同的类型可以实现同一个接口。
接口嵌套
接口与接口间可以通过嵌套创造出新的接口。
//定义speaker接口type speaker interface { speak()}//定义mover接口type mover interface { move()}// 接口嵌套type animal interface { speaker mover}//定义cat结构体type cat struct { name string}//cat是值类型接收者func (c cat) speak() { fmt.println("喵喵喵")}func (c cat) move() { fmt.println("猫会动")}func main() { var x animal x = cat{name: "花花"} x.move() //猫会动 x.speak() //喵喵喵}空接口空接口定义
空接口是指没有定义任何方法的接口。空接口类型的变量可以存储任意类型的变量。
//空接口func main() { var x interface{} x = 100 //int类型 fmt.println(x) //100 x = "ares" //string类型 fmt.println(x) //ares x = struct { //结构体类型 name string }{name:"ares"} //结构体赋值 fmt.println(x) //ares}空接口应用
空接口可以作为函数的参数或map的值。
//空接口func showtype(a interface{}) { fmt.printf("type:%t\\\\n", a)}func main() { //空接口作为函数的参数 showtype(100) //type:int showtype("ares") //type:string //定义一个值为空接口的map var stu = make(map[string]interface{},100) stu["ares"] = 100 stu["ares1"] = "男" fmt.println(stu) //map[ares:100 ares1:男] //map,key是字符串,value是任意类型 map1 := make(map[string]interface{}) map1["name"] = "ares" map1["age"] = 18 map1["id"] = 1 map1["friend"] = struct { name string age int }{"jay", 33} fmt.println(map1) //map[age:18 friend:{jay 33} id:1 name:ares] }接口嵌套
类似于继承。
type a interface { test1()}type b interface { test2()}type c interface { a b test3()}type cat struct { //如果要实现接口c,需要将接口a和接口b中的方法一起实现}func (c cat) test1() { fmt.println("test1...")}func (c cat) test2() { fmt.println("test2...")}func (c cat) test3() { fmt.println("test3...")}func main() { var cat = cat{} cat.test1() //test1... cat.test2() //test2... cat.test3() //test3... //将cat赋值接口a类型,则只能使用test1方法 var cat1 a = cat{} cat1.test1() //test1... //将cat赋值接口b类型,则只能使用test2方法 var cat2 b = cat{} cat2.test2() //test2...}类型断言
语法:
x.(t)x:表示类型为interface{}的变量
t:表示断言x可能是的类型
若为true则表示断言成功,为false则表示断言失败。
//类型断言func justifytype(x interface{}) { switch v := x.(type) { case string: fmt.printf("x is a string,value is %v\\\\n", v) case int: fmt.printf("x is a int is %v\\\\n", v) case bool: fmt.printf("x is a bool is %v\\\\n", v) case *string: fmt.printf("x is a point指针 is %v\\\\n", v) case struct{}: fmt.printf("x is a struct is %v\\\\n", v) default: fmt.println("unsupport type!")

怎么注册公司域名?如何注册公司域名邮箱?
炫云服务器为什么这么便宜了
腾讯云中国台湾服务器租用
快过年了,这些春节域名你知道几个?
如何申请ssl证书 ssl证书审核需要多久
谷歌云搭建网站服务器
购买云服务器的注意事项
佛山网站建有什么流程?佛山网站建设的作用是什么?