「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。
0 环境
- 系统环境:win10
- 编辑器:vscode
- go版本:gol.17.3
- 参考文章:go语言中文文档
1 前言
接口是一种抽象类型。接口定义好了规则,大家按这个规则来就行。就好比接口就是卖家,假设他专门卖锅的,我卖买的是他家锅的功能,使用者是买家,至于你拿锅是炖菜还是煮饭(数据),那是你的事情了。
2 定义
1. 接口名:一般会在单词后面添加er。
2. 首字母大写(接口类型名和方法名都大写是,可被包外访问)。
type 接口类型名 interface{
方法名1(参数列表1) 返回值列表1
方法名2(参数列表2) 返回值列表2
…
}
3 值接收者
如下下面的代码主要做了什么:1、定义了Mover的接口,具备吃这个功能。2、定义结构体(猫)。3、接口实现,定义一个方法
func (结构体(猫)) 接口里的具体功能 {具体逻辑},并且它是一个值接收者。4、show函数,展示结果用的,具体代码含义:定义一个接口变量,将实例化后的cat类型(值)或者*cat(&--> 指针接收者)。也就是说,当它是值类型接收者实现接口的时候,无论是类型本身还是它的指针类型,最终的结果是一致的(都能实现)。
package main
import "fmt"
type Mover interface{
eat()
}
type cat struct{}
func (c cat) eat(){
fmt.Println("猫吃鱼")
}
func show() {
var x Mover
var c = cat{}
x = c
x.eat()
var c1 =&cat{}
x = c1
x.eat()
}
func main() {
show()
}
当我去调用接口里的那个功能时,它找不到接口的实现,就会报这个错,别忘了去实现它。
根据上面的示例,以及之前结构体笔记里的代码,改造一下接口的实现和调用。
package main
import "fmt"
type user struct {
id uint
userName string
addr address
}
type address struct {
city string
}
type Stringer interface {
show() string
}
func (u user) show() string {
fmt.Println("the username is -->",u.userName," |id is -->",u.id)
return "ok"
}
func printString(u Stringer) {
fmt.Println(u.show())
}
func structDemo() {
u := user{userName:"小明", id: 1, addr : address{
city: "美国",
}}
printString(u)
printString(&u)
}
func main() {
structDemo()
}
只是把结构体赋值接口以及调用接口里的功能和结构体赋值封装成方法。
4 总结
注意接口的定义(
type xxx interface {}),方法名的大小写,接口实现(有返回值时,别忘了加返回值类型)和调用,当接口实现是值接收者类型时,无所谓是类型本身还是它的指针类型。封装和改造已有的代码。