分享
  1. 首页
  2. 文章

Golang 入门系列(四)如何理解interface接口

zhangweizhong · · 1182 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前面讲了很多Go 语言的基础知识,包括go环境的安装,go语言的语法等,感兴趣的朋友,可以先看看之前的文章。https://www.cnblogs.com/zhangweizhong/category/1275863.html

今天就正式开始写Go 的代码,讲讲如何理解interface接口。

1. 什么是interface接口

interface 是GO语言的基础特性之一。可以理解为一种类型的规范或者约定。它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或"implements"关键字,只是通过约定的形式,隐式的实现interface 中的方法即可。因此,Golang 中的 interface 让编码更灵活、易扩展。

如何理解go 语言中的interface ? 只需记住以下三点即可:

1. interface 是方法声明的集合
2. 任何类型的对象实现了在interface 接口中声明的全部方法,则表明该类型实现了该接口。
3. interface 可以作为一种数据类型,实现了该接口的任何对象都可以给对应的接口类型变量赋值。

注意:
a. interface 可以被任意对象实现,一个类型/对象也可以实现多个 interface
b. 方法不能重载,如 eat() eat(s string) 不能同时存在


2. 接口实现

package main
import "fmt"
type Phone interface {
 call()
}
type NokiaPhone struct {
}
func (nokiaPhone NokiaPhone) call() {
 fmt.Println("I am Nokia, I can call you!")
}
type ApplePhone struct {
}
func (iPhone ApplePhone) call() {
 fmt.Println("I am Apple Phone, I can call you!")
}
func main() {
 var phone Phone
 phone = new(NokiaPhone)
 phone.call()
 phone = new(ApplePhone)
 phone.call()
}

3. interface 查询

如果接口A实现了接口B中所有方法,那么A可以转化为B接口。

 if varName2, ok := varName1.(interface2|typeName); ok {
 //此时 varName2 的类型由 interface1 转为 interface2,或者 varName1 不是 typeName 类型的变量
 } else {
 //不能转换 interface,或者 varName1 不是 typeName 类型的变量

4. interface{} 类型

interface{} 类型没有声明任何一个方法,俗称空接口。interface{} 在我们需要存储任意类型的数值的时候相当有用,有点类似于C语言的void*类型。

package main
import (
 "fmt"
)
func PrintAll(vals []interface{}) {
 for _, val := range vals {
 fmt.Println(val)
 }
}
func main() {
 names := []string{"stanley", "david", "oscar"}
 vals := make([]interface{}, len(names))
 for i, v := range names {
 vals[i] = v
 }
 PrintAll(vals)
}

然而,需要注意的是,[]T不能直接赋值给[]interface{}

 t := []int{1, 2, 3, 4}
 var s []interface{} = t

编译时会输出下面的错误:

cannot use t (type []int) as type []interface {} in assignment

最后

以上,对Go 语言中的接口特性做了一个简单的介绍。我觉得对于go语言来说,设计最精妙的应该是interface了,感兴趣的,可以好好研究研究。


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:zhangweizhong

查看原文:Golang 入门系列(四)如何理解interface接口

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1182 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏