go 语言多态、继承的实现方法、go interface 接口
程序员文章站
2022-06-14 11:00:18
...
在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心。
(1)、 泛型编程
严格来说,在 Golang 中并不支持泛型编程。使用 interface 我们可以实现泛型编程,如下是一个参考示例:
- 字符串排序
package main
import (
"fmt"
"sort"
)
// 将[]string定义为MyStringList类型
type MyStringList []string
// 实现sort.Interface接口的获取元素数量方法
func (m MyStringList) Len() int {
return len(m)
}
// 实现sort.Interface接口的比较元素方法
func (m MyStringList) Less(i, j int) bool {
return m[i] < m[j]
}
// 实现sort.Interface接口的交换元素方法
func (m MyStringList) Swap(i, j int) {
m[i], m[j] = m[j], m[i]
}
func main() {
// 准备一个内容被打乱顺序的字符串切片
names := MyStringList{
"3. Triple Kill",
"5. Penta Kill",
"2. Double Kill",
"4. Quadra Kill",
"1. First Blood",
}
// 使用sort包进行排序
sort.Sort(names)
// 遍历打印结果
for _, v := range names {
fmt.Printf("%s\n", v)
}
}
Sort包、实现一个泛型 排序功能,用户定义的类型,只有实现 Len()、Less()和Swap()方法,就可以直接调用Sort()函数、对自定义类型数据进行排序。接下来在看下面例子:
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%s: %d", p.Name, p.Age)
}
// ByAge implements sort.Interface for []Person based on
// the Age field.
type person []Person //自定义
func (a person) Len() int { return len(a) }
func (a person) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a person) Less(i, j int) bool { return a[i].Age < a[j].Age }
func main() {
people := []Person{
{"Bob", 31},
{"John", 42},
{"Michael", 17},
{"Jenny", 26},
}
fmt.Println(people)
sort.Sort(person(people))
fmt.Println(people)
}
这是自定义结构体类型数据排序的例子,通过此两个例子可以体会go 语言泛型编程的方法。在看一个简单的 interface 例子:
package main
import "fmt"
func main() {
//空接口是万能类型,保存任意类型的值
var i interface{} = 1
fmt.Println("i = ", i)
i = "abc"
fmt.Println("i = ", i)
}
由此我们可以推断、sort 包的实现方式也应该采用空接口的类型、实现 Sort() 函数控制逻辑;所以用户只要实现 sort 包依赖的 Len()、Swap()和 Less()方法后,在调用 Sort()函数就能够满足多种类型的数据排序。