PHPer的Go之路 -- 接口

臭大佬 2019-12-08 22:58:46 1273
Go 
简介 在 Go 语言中,接口就是方法签名(Method Signature)的集合。当一个类型定义了接口中的所有方法,我们称它实现了该接口。这与面向对象编程(OOP)的说法很类似。接口指定了一个类型应该具有的方法,并由该类型决定如何实现这些方法。

接口的声明与实现

Go 语言通过关键字 type 和 interface 来声明接口,花括号内包含都是待实现的方法集合

package main

import (  
    "fmt"
)

//interface definition
type VowelsFinder interface {  
    FindVowels() []rune
}

type MyString string

//MyString implements VowelsFinder
func (ms MyString) FindVowels() []rune {  
    var vowels []rune
    for _, rune := range ms {
        if rune == 'a' || rune == 'e' || rune == 'i' || rune == 'o' || rune == 'u' {
            vowels = append(vowels, rune)
        }
    }
    return vowels
}

func main() {  
    name := MyString("Sam Anderson")
    var v VowelsFinder
    v = name // possible since MyString implements VowelsFinder
    fmt.Printf("Vowels are %c", v.FindVowels())
}

 

接口继承

Go 语言也支持类似的「接口继承」,但是由于不支持 extends 关键字,所以其实现和类的继承一样,是通过组合来完成的。以上面这个 PHP 示例为例,在 Go 语言中,我们可以这样通过接口组合来实现接口继承,就像类的组合一样:

type C interface {
    A()
}

type D interface {
    A
    B()
}

空接口

没有包含方法的接口称为空接口。空接口表示为 interface{}。由于空接口没有方法,因此所有类型都实现了空接口。

var v1 interface{} = 1 // 将 int 类型赋值给 interface{} 
var v2 interface{} = "臭大佬" // 将 string 类型赋值给 interface{} 
var v3 interface{} = true  // 将 bool 类型赋值给 interface{}

var v4 interface{} = &v2 // 将 *interface{} 类型(指针)赋值给 interface{} 
var v5 interface{} = []int{1, 2, 3}  // 将切片类型赋值给 interface{} 
var v6 interface{} = struct{   // 将自定义类型赋值给 interface{}
    id int
    name string
}{1, "德玛西亚"}