十、接口
定义接口的类型,仅仅是方法的集合
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]
浙公网安备 33010602011771号