有哪些同学能具体说说go语言中接口的好处?能带例子说明

共 8 个回复


descusr

我的理解是:空接口也就等于JAVA/C#/python 里面的object

# 0

polaris

直接说等于,这太不合适了吧

# 1

gogo

这里有一个例子: 我想知道更多的接口的好处?

package main import ( "fmt" )

type Sorter interface { Len() int Less(i, j int) bool Swap(i, j int) }

type Xi []int type Xs []string

func (p Xi) Len() int { return len(p) } func (p Xi) Less(i int, j int) bool { return p[j] < p[i] } func (p Xi) Swap(i int, j int) { p[i], p[j] = p[j], p[i] }

func (p Xs) Len() int { return len(p) } func (p Xs) Less(i int, j int) bool { return p[j] < p[i] } func (p Xs) Swap(i int, j int) { p[i], p[j] = p[j], p[i] }

func Sort(x Sorter) { for i := 0; i < x.Len() - 1; i++ { for j := i + 1; j < x.Len(); j++ { if x.Less(i, j) { x.Swap(i, j) } } } } func main() { ints := Xi{44, 67, 3, 17, 89, 10, 73, 9, 14, 8} strings := Xs{"nut", "ape", "elephant", "zoo", "go"} Sort(ints) fmt.Printf("%v\n", ints) Sort(strings) fmt.Printf("%v\n", strings) }

# 2

gogo

package main import ( "fmt" )

type Sorter interface { Len() int Less(i, j int) bool Swap(i, j int) }

type Xi []int type Xs []string

func (p Xi) Len() int { return len(p) } func (p Xi) Less(i int, j int) bool { return p[j] < p[i] } func (p Xi) Swap(i int, j int) { p[i], p[j] = p[j], p[i] }

func (p Xs) Len() int { return len(p) } func (p Xs) Less(i int, j int) bool { return p[j] < p[i] } func (p Xs) Swap(i int, j int) { p[i], p[j] = p[j], p[i] }

func Sort(x Sorter) { for i := 0; i < x.Len() - 1; i++ { for j := i + 1; j < x.Len(); j++ { if x.Less(i, j) { x.Swap(i, j) } } } } func main() { ints := Xi{44, 67, 3, 17, 89, 10, 73, 9, 14, 8} strings := Xs{"nut", "ape", "elephant", "zoo", "go"} Sort(ints) fmt.Printf("%v\n", ints) Sort(strings) fmt.Printf("%v\n", strings) }

# 3

jimmykuu

Go中的接口是非侵入式的,一个类型中实现了接口中的方法,就是实现了接口。

相比Java中的接口设计,你需要先定成一个接口,import进来,然后implements这个接口,并实现其方法,才算实现了这个接口。

举例如下:

type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

type ReadWriter interface {
    Reader
    Writer
}

这里定义了三个接口,如果一个类型实现了Read(p []byte) (n int, err error)方法,那么就是实现了Reader接口,如果实现了Write(p []byte) (n int, err error)方法,那么就是实现了Writer接口,如果这两个方法都实现了,那么Reader,Writer,ReaderWriter三个接口都实现了,需要这三个接口的地方,这个类型都满足。

type File struct {
}

func (f *File) Read(b []byte) (n int, err error) {}
func (f *File) Write(b []byte) (n int, err error) {}

这个File类型就同时满足这三个接口,像下面这段代码就可以运行:

func a(r Reader) {}
func b(w Writer) {}
func c(rw ReaderWriter){}

f := File{}
a(f)
b(f)
c(f)
# 4

gogo

非常感谢各位的帮助!

# 6