GO语言中什么是接口?老男孩GO语言开发课程
老男孩IT教育
常见问题
2021年6月28日 17:34
Go 语言中的接口很特别,而且提供了难以置信的一系列灵活性和抽象性。它们指定一个特定类型的值和指针表现为特定的方式。
Go 语言中的接口很特别,而且提供了难以置信的一系列灵活性和抽象性。它们指定一个特定类型的值和指针表现为特定的方式。从语言角度看,接口是一种类型,它指定一个方法集,所有方法为接口类型就被认为是该接口。
interface是一种类型,默认是一个指针。interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。
接口定义
第一种,定义一个空接口
空接口 interface{} 没有任何方法签名,也就意味着任何类型都实现了空接口。
var i interface{}
第二种,定义一个接口,并赋值
var name interface{} = "oldboy"
第三种,使用interface定义一组方法,方法签名的集合
type I interface {
method1() // 无参数、无返回值
method2(i int) // 单参数、无返回值
method3(x, y int) // 多参数、无返回值
method4() (i int) // 无参数、单返回值
method5(x, y int) (z int, err error) //多参数、多返回值
}
类型断言
Go语言类型断言语法为value, ok := em.(T) 如果确保em 是同类型的时候可以直接使用value:=em.(T)一般用于switch语句中。
em :代表要判断的变量
T :代表被判断的类型
value:代表返回的值
ok:代表是否为改类型
注意:要判断的变量必须为initerface类型才可以进行类型断言。
package main
import "fmt"
func main() {
s := "golang"
if v, ok := s.(string); ok {
fmt.Println(v)
}
}
编译错误:
./main.go:7:15: invalid type assertion: s.(string) (non-interface type string on left)
用 switch 做批量类型判断,不支持 fallthrough,实例如下:
package main
import "fmt"
type User struct {
id int
name string
}
func (self *User) String() string {
return fmt.Sprintf("%d, %s", self.id, self.name)
}
func main() {
var i interface{} = &User{18, "oldboy"}
switch v := i.(type) {
case nil:
fmt.Println("nil")
case fmt.Stringer:
fmt.Println(v)
case func() string:
fmt.Println(v())
case *User:
fmt.Printf("%d, %s\n", v.id, v.name)
default:
fmt.Println("unknown")
}
}
如果你想要学习GO语言,欢迎来老男孩教育。我们为学员提供免费试听,来校试听即送《8周掌握Go语言》书籍,本书由老男孩教育多位金牌讲师依托老男孩教育多年线下教育实践经验撰写,可以帮你快速上手GO语言。
推荐阅读:
