go 接口

本文介绍了一个Go语言中的接口示例,展示了如何定义接口并由具体结构体实现这些接口。通过一个具体的例子,解释了在使用接口变量时,如何根据两个规则调用不同类型的方法。

go自学第二天,留个笔记,万一以后忘了呢

package main

import "fmt"

type I interface{
    get() int 
    set(int)
}

//S实现了I接口
type S struct{
    value int 
}

//S在这里叫接受者
func (s S) get() int{
    return s.value
}

func (s *S) set(x int){
    s.value = x 
}

//这里我们可以通过接口I来传入实现I接口的各种类型(比如上面的S)
func myTest(i I){ 
    fmt.Printf("value=%d\n", i.get())
    i.set(100)
    fmt.Printf("value=%d\n", i.get())
}

func main(){
    s := &S{}
    myTest(s)//这里有两个规则要说一下
}

1.类型 *T 的可调用方法集包含接受者为 *T 或 T 的所有方法集
这条规则说的是如果我们用来调用特定接口方法的接口变量是一个指针类型,那么方法的接受者可以是值类型也可以是指针类型。

2.类型 T 的可调用方法集包含接受者为 T 的所有方法
这条规则说的是如果我们用来调用特定接口方法的接口变量是一个值类型,那么方法的接受者必须也是值类型该方法才可以被调用。

可以变换接受者的值类型和调用时传入类型测试以下。

### 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、付费专栏及课程。

余额充值