go_接口

在Go中,接口类型是一种抽象类型,是方法的集合,其他类型实现了这些方法就是实现了这个接口

声明和实现接口

type interface_name interface {
	method_name1[return_type]
	method_name2[return_type]
	method_name3[return_type]
	method_name4[return_type]
	...
	method_namen[return_type]
}
package main

import (
	"fmt"
)

// 接口定义
type VowelsFinder interface {
	//方法
	FindVowels() []rune
}

// 创建一个类型MyString,它只是string的包装类
type MyString string

// MyString 应用 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())

}

空接口

一个没有方法的接口称为空接口
它表示为interface{}
由于空接口没有任何方法,所以所有类型都实现空接口

package main
 
import (  
    "fmt"
)
 
func describe(i interface{}) {//函数作为一个空接口作为参数,因此它可以传递任何类型
    fmt.Printf("Type = %T, value = %v\n", i, i)
}
 
func main() {  
    s := "Hello World"
    describe(s)
    i := 55
    describe(i)
    strt := struct {
        name string
    }{
        name: "Naveen R",
    }
    describe(strt)
}

类型断言

类型断言用于提取接口的基础值

i.(T) 是用于获取具体类型为T的接口i的底层值的语法

package main
 
import (  
    "fmt"
)
 
func assert(i interface{}) {  
    s := i.(int) //get the underlying int value from i
    fmt.Println(s)
}
func main() {  
    var s interface{} = 56
    assert(s)
}
v,ok := i.(T)

如果i的具体类型是T,那么v的值就是i,ok为true
如果i的具体类型不是T,那么ok将是false,v将是类型T的零值,程序不会报错

注意:上面所有示例接口都是使用值接收器实现的。也可以使用指针接收器来实现接口。但是会有一些微妙的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值