go 接口

demo如下:

package main

import "fmt"

//定义一个接口
type Phone interface {
    speak()
    read()
}

//以下结构体可以分别设置自己的属性
type IPhone struct {
    name string
}

type Oppo struct {
    id int
}
type Mi struct { f bool } // 手机讲话区域(对相关的接口进行实现) func (a IPhone) speak() { fmt.Println("我叫sir,您好!") } func (a IPhone) read() { fmt.Println("爱疯,read!") } func (a Oppo) read() { fmt.Println("oppo,read!") } func (a Oppo) speak() { fmt.Println("我是oppo小精灵!") } func (a Mi) speak() { fmt.Println("大家好,我是小爱童鞋!") }
func (a Mi) read() {
    fmt.Println("mi,read!")
}
// 中央广场展示大舞台(可以直接将不同的实现接口的结构体对象传进来) 
func show(myPhone Phone) {
myPhone.speak()
}


func main() {
// 将新建对象传入展示大舞台,大舞台代码不变,展示不同的效果
var r = Oppo{1}
var a Phone = r
a = IPhone{ "aa", }
show(a)
}

结束!

### Go语言接口的定义和使用 在Go语言中,接口(interface)是一种抽象类型,它定义了一组方法的集合,但不提供这些方法的具体实现。接口的主要作用是通过定义一组行为规范,使得不同类型的对象可以通过实现这些行为来满足接口的要求。 #### 1. 接口的定义 接口的定义格式如下: ```go type 接口类型名 interface { 方法名1(参数列表1) 返回值列表1 方法名2(参数列表2) 返回值列表2 ... } ``` 接口的命名习惯通常以`er`结尾,例如`Reader`、`Writer`等[^3]。接口中的方法只有声明,没有具体实现,并且方法的参数列表和返回值列表可以省略变量名[^4]。 #### 2. 实现接口的条件 在Go语言中,一个类型只要实现了接口中定义的所有方法,就认为该类型实现了这个接口,而无需显式声明实现了哪个接口。这种机制被称为结构化类型系统(Structural Typing)。例如,如果一个类型的方法集中包含接口定义的所有方法签名(名称、参数列表和返回值列表一致),则该类型自动实现该接口[^4]。 #### 3. 接口的使用示例 以下是一个简单的示例,展示如何定义和使用接口: ```go package main import "fmt" // 定义接口 type Phone interface { call() } // 定义NokiaPhone类型并实现call方法 type NokiaPhone struct{} func (nokia NokiaPhone) call() { fmt.Println("I am Nokia, I can call you!") } // 定义IPhone类型并实现call方法 type IPHONE struct{} func (iphone IPHONE) call() { fmt.Println("I am iPhone, I can call you!") } func main() { var phone Phone // 将NokiaPhone赋值给Phone接口 phone = new(NokiaPhone) phone.call() // 将IPhone赋值给Phone接口 phone = new(IPHONE) phone.call() } ``` 运行结果为: ``` I am Nokia, I can call you! I am iPhone, I can call you! ``` 在此示例中,`Phone`接口定义了一个`call`方法,`NokiaPhone`和`IPHONE`两个类型分别实现了该方法。通过将不同类型的对象赋值给`Phone`接口变量,可以调用它们各自实现的`call`方法[^5]。 #### 4. 接口的多态性 接口支持多态性,这意味着可以通过接口变量调用不同类型的对象所实现的方法。例如,在上述代码中,`phone`变量可以指向`NokiaPhone`或`IPHONE`类型的对象,并调用它们各自的`call`方法。 #### 5. 空接口接口`interface{}`表示没有任何方法的接口,它可以存储任何类型的值。因此,空接口常被用作通用数据容器[^4]。 ```go var value interface{} = 42 fmt.Println(value) value = "Hello, World!" fmt.Println(value) ``` #### 6. 类型断言与接口转换 通过类型断言,可以从接口中提取具体的类型信息。例如: ```go value := "Hello, World!" if str, ok := value.(string); ok { fmt.Println("Value is a string:", str) } else { fmt.Println("Value is not a string") } ``` #### 7. 接口的嵌套 接口可以匿名嵌套其他接口,形成更复杂的接口定义。例如: ```go type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) } type ReadWriter interface { Reader Writer } ``` 在此示例中,`ReadWriter`接口包含了`Reader`和`Writer`接口的所有方法。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值