go 接口
go接口定义
接口类型由数个方法组成
type 接口名 interface{
方法名(参数)返回值列表
}
go使用接口
package main
import "fmt"
type USB interface {
read()
write()
}
type file struct {
}
func (f *file) read() {
fmt.Printf("read")
}
func (f *file) write() {
fmt.Println("write")
}
func main() {
f := new(file)
usb := f
usb.write()
}
这是一个完整的使用接口进行结构体方法的使用
接口被实现的条件一:接口的方法与实现接口的类型方法格式一致
接口被实现的条件二:接口中所有方法均被实现
当我们在接口中定义了多个方法,这些方法必须全部被实现,此接口才有效
一个类型可以实现多个接口,接口和接口之间的实现并无任何关系
一个接口也可以由多个类型来实现
go语言类型断言
value, ok := x.(T)
x是接口 T是类型
- 如果T是具体的类型,类型断言会检查 x 的动态类型是否等于具体类型 T。如果检查成功,类型断言返回的结果是 x 的动态值,其类型是 T。
- 如果 T 是接口类型,类型断言会检查 x 的动态类型是否满足 T。如果检查成功,x 的动态值不会被提取,返回值是一个类型为 T 的接口值。
- 无论 T 是什么类型,如果 x 是 nil 接口值,类型断言都会失败。
go排序
一个内置的排序算法需要知道三个东西:序列的长度,表示两个元素比较的结果,一种交换两个元素的方式;这就是 sort.Interface 的三个方法:
package sort
type Interface interface {
Len() int // 获取元素数量
Less(i, j int) bool // i,j是序列元素的指数。
Swap(i, j int) // 交换元素
}
[图片上传失败...(image-695366-1654346419134)]
这些是简化过的方法,不过对于foat32,float64,int64之类的类型,sort包还没有实现,我们就可以根据sort.Interface来自己实现
package main
import (
"fmt"
"sort"
)
type MyStringList []float32
func (m MyStringList) Len() int {
return len(m)
}
func (m MyStringList) Less(a, b int) bool {
return m[a] < m[b]
}
func (m MyStringList) Swap(a, b int) {
m[a], m[b] = m[b], m[a]
}
func main() {
names := MyStringList{
1.2,
2.3,
3.4,
4.5,
}
// 使用sort包进行排序
sort.Sort(names)
// 遍历打印结果
for _, v := range names {
fmt.Printf("%.2f\n", v)
}
}