Golang:接口(interface)


Go中没有class的概念。Go 语言中使用组合实现对象特性的描述。对象的内部使用结构体内嵌组合对象应该具有的特性,对外通过接口暴露能使用的特性。
Go 语言的接口设计是非侵入式的,接口不知道接口被哪些类型实现。而实现不用指明具体实现哪一个接口。编译时时编译器会指明使用哪个类型实现哪个接口。

只有让接口和实现解耦,编译速度才能真正提高,项目之间的耦合度也会降低不少。 很多其他语言实现接口时,是必须指定接口的。

 

实现接口

只有接口的方法名,参数,返回值都在某一类型中对应上,我们才说这个类型实现了接口。

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 // interface
 8 type Animal interface {
 9     Cry(data interface{}) error
10 }
11 
12 // stuct
13 type Cat struct {
14 }
15 
16 func (cat *Cat) Cry(data interface{}) error {
17     fmt.Println("Mi:", data)
18     return nil
19 }
20 func main() {
21     cat := new(Cat)
22     var animal Animal
23     animal = cat
24     animal.Cry("Ao")
25 }

在16行Cat实现了Animal的唯一方法,所以在23,14行我们可以使用animal调用cat的方法。

 sort.Interface


sort.interface是Go内置的一个帮助排序的接口。接口的定义如下

 1 // A type, typically a collection, that satisfies sort.Interface can be
 2 // sorted by the routines in this package. The methods require that the
 3 // elements of the collection be enumerated by an integer index.
 4 type Interface interface {
 5     // Len is the number of elements in the collection.
 6     Len() int
 7     // Less reports whether the element with
 8     // index i should sort before the element with index j.
 9     Less(i, j int) bool
10     // Swap swaps the elements with indexes i and j.
11     Swap(i, j int)
12 }

其中包含排序需要的:数量(Len)、比较(Less)、交换(Swap)

实现接口

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "sort"
 6 )
 7 
 8 type IntList []int
 9 
10 func (i IntList) Len() int {
11     return len(i)
12 }
13 func (i IntList) Less(a, b int) bool {
14     return i[a]%10 < i[b]%10
15 }
16 func (i IntList) Swap(a, b int) {
17     i[a], i[b] = i[b], i[a]
18 }
19 func main() {
20     ints := IntList{3, 14, 1, 45, 37, 22, 85, 19}
21     sort.Sort(ints)
22     for _, v := range ints {
23         fmt.Printf("%s\n", v)
24     }
25 }

 

这个代码并不复杂,主要看清除4行即可。打印结果

%!s(int=1)
%!s(int=22)
%!s(int=3)
%!s(int=14)
%!s(int=45)
%!s(int=85)
%!s(int=37)
%!s(int=19)

 使用sort.Slice进行切片元素排序

 sort.Slice() 函数进行更为简便的排序方法,把上面的代码稍微整理之后:

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "sort"
 6 )
 7 
 8 type IntList []int
 9 
10 func main() {
11     ints := IntList{3, 14, 1, 45, 37, 22, 85, 19}
12     sort.Slice(ints, func(i, j int) bool {
13 
14         return ints[i]%10 < ints[j]%10
15     })
16     for _, v := range ints {
17         fmt.Printf("%s\n", v)
18     }
19 }

 

 

 

 

posted @ 2019-02-19 15:15  JustDotNet  阅读(333)  评论(0编辑  收藏  举报