golang系列----接口使用技巧(interface)
2018-01-15 20:13
741 查看
golang中的interface是什么
Go不是一种传统的面向对象的语言,它在语法上不支持类和继承的概念,而interface就是让它在效果上实现了类似于C++的“多态”概念。由于本篇文章主要是讲interface使用的一些小技巧所以不对接口做过多的解释,有兴趣的可以参考:什么是接口
空接口(empty interface)
空接口比较特殊,他不包含任何方法,但是他又可以表示任何类型golang的所有基础类都实现了空接口
所有我们可以用[]interface表示结构不同的数组
比如:
func main() { data := make([]interface{}, 3) intData := 1 stringData := "abc" boolData := true data[0] = intData data[1] = stringData data[2] = boolData for _, v := range data { fmt.Println(v) } }
接口嵌套接口
一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。比如接口 File 包含了 ReadWrite 和 Lock 的所有方法,它还额外有一个 Close() 方法。
type ReadWrite interface { Read(b Buffer) bool Write(b Buffer) bool } type Lock interface { Lock() Unlock() } type File interface { ReadWrite Lock Close() }
类型的选择与断言
一个接口类型的变量 varI 中可以包含任何类型的值,必须有一种方式来检测它的 动态 类型,即运行时在变量中存储的值的实际类型。在执行过程中动态类型可能会有所不同,但是它总是可以分配给接口变量本身的类型。通常我们可以使用类型断言 来测试在某个时刻 接口varI 是否包含类型 T 的值:v := varI.(T)
类型断言可能是无效的,虽然编译器会尽力检查转换是否有效,但是它不可能预见所有的可能性。如果转换在程序运行时失败会导致错误发生。更安全的方式是使用以下形式来进行类型断言:
if v, ok := varI.(T); ok { // checked type assertion Process(v) return }
示例:
type Interge struct { a int } type String struct { b string } type printdata interface {} func main() { var data printdata //输出自身属性的接口 data = String{"ssss"} if t, ok := data.(Interge); ok { fmt.Printf("I am %T\n", t) } if t, ok := data.(String); ok { fmt.Printf("I am %T\n", t) } }
接口变量的类型也可以使用一种特殊形式的 switch 来检测:type-switch
type Interge struct { a int } type String struct { b string } type printdata interface { } func main() { var data printdata //输出自身属性的接口 data = String{"ssss"} switch t := data.(type) { case Interge: fmt.Printf("I am %T\n", t, t) case String: fmt.Printf("I am %T\n", t) } }
如果是一个接口数组包含任意类型,那么我们就可以用上面这种方法根据不同接口的类型做出不同的操作
接口方法集的调用规则
类型 *T 的可调用方法集包含接受者为 *T 或 T 的所有方法集类型 T 的可调用方法集包含接受者为 T 的所有方法
类型 T 的可调用方法集不包含接受者为 *T 的方法
相关文章推荐
- golang基础之Interface接口的使用
- VS2005新控件之GridView 使用高级技巧系列[二][视频]
- winVista系列技巧之各种中文输入法的使用
- Vista系列技巧之各种中文输入法的使用
- C#中datagridview使用技巧系列谈(-)让输入焦点从左到右
- 窗口使用技巧系列文章--自动调整窗口
- 泛型技巧系列:避免基类及接口约束
- Delphi中Interface接口的使用方
- LuaInterface的使用技巧
- C#中datagridview使用技巧系列谈(-)让输入焦点从左到右收藏
- HessianCSharp 1.3.3版本前使用泛型以及接口interface继承问题解决方案!!(实例代码)
- C# 接口使用 (interface)
- Android SDK开发指南(翻译)系列三:Tools(一)--使用AIDL, 设计一个远程接口
- 从头开始学代理(新手必读)系列之-二次代理的使用技巧
- FireFox高级使用技巧系列(二)
- 尽量使用接口来编程等基本技巧
- [Silverlight]奇技银巧系列-6 使用点阵字体(如宋体)及相关方面的技巧
- FireFox高级使用技巧系列(一)——用Firefox将Gmail变成您的GB级FTP服务器
- 27:ASP.NET复习系列- ADO.NET基本知识点-数据集的使用方法和技巧
- VS2005新控件之GridView 使用高级技巧系列[一][视频]