Go-接口
在 Golang 中接口(interface)是一种类型,一种抽象的类型。接口(interface)是一组函数 method (方法)的集合,Golang 中的接口不能包含任何变量。
在 Golang 中接口中的所有方法都没有方法体,接口定义了一个对象的行为规范,只定
义规范不实现。接口体现了程序设计的多态和高内聚低耦合的思想Golang 中的接口也是一种数据类型,不需要显示实现。只需要一个变量含有接口类型
中的所有方法,那么这个变量就实现了这个接口。
定义接口
Golang 中每个接口由数个方法组成,接口的定义格式如下:
其中:
接口名:使用 type 将接口定义为自定义的类型名。Go 语言的接口在命名时,一般会在
单词后面添加 er,如有写操作的接口叫 Writer,有字符串功能的接口叫 Stringer 等。接
口名最好要能突出该接口的类型含义。
方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被
接口所在的包(package)之外的代码访问。
参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。
结构体实现接口
package main
import "fmt"
type Person interface {
eat()
play()
//ku(name string, age int) int //定义参数 返回值
}
type xm struct {
}
func (m xm) eat() {
fmt.Println("Xiao Ming is eating an apple")
}
func (m xm) play() {
fmt.Println("Xiao Ming is playing ping-pong")
}
// 结构体方法
func (m xm) run() {
fmt.Println("Xiao Ming is running")
}
func main() {
xm := xm{} // 实例化结构体
//xm结构体实现Person接口
var p Person = xm
p.eat()
p.play()
//p.run() // 没有run接口方法 就会报错
xm.run() // 使用结构体对象调用自己的方法
/*
结果:
Xiao Ming is eating an apple
Xiao Ming is playing ping-pong
Xiao Ming is running
*/
}
空接口
Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。空接口表示
没有任何约束,因此任何类型变量都可以实现空接口。因为空接口可以存储任意类型值的特点,所以空接口在 Go 语言中的使用十分广泛。
package main
import "fmt"
func main() {
// 定义空接口 a a可以接收任何的数据类型
var a interface{}
fmt.Printf("%T\n", a) //<nil>
a = 1
fmt.Printf("type:%T == value:%v\n", a, a) //type:int == value:1
a = "Hello go"
fmt.Printf("type:%T == value:%v\n", a, a) //type:string == value:Hello go
a = true
fmt.Printf("type:%T == value:%v\n", a, a) //type:bool == value:true
}
空接口作为函数的参数
使用空接口实现可以接收任意类型的函数参数。
// 空接口作为函数参数
func show(a interface{}) {
fmt.Printf("type:%T value:%v\n", a, a)
}
map 的值实现空接口
使用空接口实现可以保存任意值的字典。
// 空接口作为 map 值
var studentInfo = make(map[string]interface{})
studentInfo["name"] = "张三"
studentInfo["age"] = 18
studentInfo["married"] = false
fmt.Println(studentInfo)
切片实现空接口
var slice = []interface{}{"张三", 20, true, 32.2}
fmt.Println(slice)
断言
断言就是对接口类型进行判断
语法格式:
x.(T)
x : 表示类型为 interface{}的变量
T : 表示断言 x 可能是的类型。
_, ok := a.(bool)
if ok {
fmt.Println("断言成功,value==", a) //断言成功,value== true
} else {
fmt.Println("断言失败")
}
结合Switch做出断言
package main
import "fmt"
func name(x interface{}) {
switch v := x.(type) {
case string:
fmt.Println("string", v)
case int:
fmt.Println("int", v)
case bool:
fmt.Println("bool", v)
default:
fmt.Println("default", v)
}
}
func main() {
name(100) //int 100
name("Java Rust Go") //string Java Rust Go
}

浙公网安备 33010602011771号