十、接口

定义接口的类型,仅仅是方法的集合

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 type S struct{ i int }
 8 
 9 func (p *S) Get() int { return p.i }
10 
11 func (p *S) Put(v int) { p.i = v }
12 
13 type R struct{ i int }
14 
15 func (p *R) Get() int { return p.i }
16 
17 func (p *R) Put(v int) { p.i = v }
18 
19 type I interface {
20     Get() int
21     Put(int)
22 }
23 
24 func f(p I) {
25     fmt.Println(p.Get())
26     p.Put(1)
27     fmt.Println(p.Get())
28     //swich之外使用type是非法的
29     switch t := p.(type) {
30     case *S: //p的实际类型是S的指针
31         fmt.Println(t)
32     case *R:
33         fmt.Println(t)
34     default:
35     }
36     //用comma,ok来判断一个接口类型是否实现了特定接口
37     if t, ok := p.(I); ok {
38         fmt.Println("类型是:", t, ok)
39     }
40     //确定一个变量实现了某个接口
41     t1 := p.(I)
42     fmt.Println(t1)
43 }
44 
45 //空接口
46 func g(q interface{}) int {
47     return q.(I).Get()
48 }
49 
50 func main() {
51     var s S //定义为S类型
52     f(&s)   //传入s的取址
53     var s1 = new(S)
54     //调用空接口
55     fmt.Println(g(s1))
56 }

结果:

0


1


&{1}


类型是: &{1} true


&{1}


0

方法

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 type Foo int
 8 
 9 func (self Foo) Emit() {
10     fmt.Println(self)
11 }
12 
13 type Emitter interface {
14     Emit()
15 }
16 
17 func main() {
18     var s Foo = 3
19     var i Emitter = s
20     i.Emit()
21 }

结果:3

不定数组排序算法

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 func bubblesort(n []int) {
 8     for i := 0; i < len(n)-1; i++ {
 9         for j := i + 1; j < len(n); j++ {
10             if n[j] < n[i] {
11                 n[i], n[j] = n[j], n[i]
12             }
13         }
14     }
15 }
16 
17 func main() {
18     s := []int{3, 2, 4, 6, 5, 4, 7, 9, 8, 11}
19     bubblesort(s)
20     fmt.Println(s)
21 }

结果:[2 3 4 4 5 6 7 8 9 11]

但是如果要按照字符排序则又要加一个func,可以用接口扩展

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 type Xi []int
 8 type Xs []string
 9 type Xf []float64
10 
11 func (p Xi) Len() int               { return len(p) }
12 func (p Xi) Less(i int, j int) bool { return p[j] < p[i] }
13 func (p Xi) Swap(i int, j int)      { p[i], p[j] = p[j], p[i] }
14 
15 func (p Xs) Len() int               { return len(p) }
16 func (p Xs) Less(i int, j int) bool { return p[j] < p[i] }
17 func (p Xs) Swap(i int, j int)      { p[i], p[j] = p[j], p[i] }
18 
19 func (p Xf) Len() int               { return len(p) }
20 func (p Xf) Less(i int, j int) bool { return p[j] < p[i] }
21 func (p Xf) Swap(i int, j int)      { p[i], p[j] = p[j], p[i] }
22 
23 type Sorter interface {
24     Len() int           //len()作为方法
25     Less(i, j int) bool //p[j] < p[i]作为方法
26     Swap(i, j int)      //p[i], p[j] = p[j], p[i]
27 }
28 
29 func Sort(x Sorter) {
30     for i := 0; i < x.Len()-1; i++ {
31         for j := i + 1; j < x.Len(); j++ {
32             if x.Less(i, j) {
33                 x.Swap(i, j)
34             }
35         }
36     }
37 }
38 
39 func main() {
40     var is Xi = []int{3, 2, 4, 6, 5, 4, 7, 9, 8, 11}
41     Sort(is)
42     fmt.Println(is)
43     var ss Xs = []string{"nut", "ape", "fg", "dff", "af", "dg"}
44     Sort(ss)
45     fmt.Println(ss)
46     var fs Xf = []float64{3.34, 2.45, 4, 6.56, 5, 4, 7, 9, 8, 11}
47     Sort(fs)
48     fmt.Println(fs)
49 }

结果:

[2 3 4 4 5 6 7 8 9 11]


[af ape dff dg fg nut]


[2.45 3.34 4 4 5 6.56 7 8 9 11]

posted on 2013-02-01 14:47  liubiaoren  阅读(137)  评论(0)    收藏  举报