专栏首页Golang语言社区go语言中的interface使用实例

go语言中的interface使用实例

go语言中的interface是一组未实现的方法的集合,如果某个对象实现了接口中的所有方法,那么此对象就实现了此接口。与其它面向对象语言不同的是,go中无需显示声明调用了哪个接口。

package main
 
import (
 "fmt"
)
 
type I interface {
 Get() int
 Put(int)
}
 
type S struct{ i int }
 
func (p *S) Get() int  { return p.i }
func (p *S) Put(v int) { p.i = v }
 
type R struct{ i int }
 
func (p *R) Get() int  { return p.i }
func (p *R) Put(v int) { p.i = v }
 
func f1(p I) {
 fmt.Println(p.Get())
 p.Put(1)
}
 
//interface{}空接口,能接受任何类型。.(I)是类型断言,用于转换something到I类型的接口
func f2(p interface{}) {
 if t, ok := p.(S); ok {
  fmt.Println("S:", t)
 } else if t, ok := p.(I); ok {
  fmt.Println("I:", t.Get())
 }
}
 
func f3(p interface{}) {
 switch t := p.(type) {
 case S:
  fmt.Println("S:", t.Get())
 case R:
  fmt.Println("R:", t.Get())
 case I:
  fmt.Println("I:", t.Get())
 default:
  fmt.Println("unknow type")
 }
}
 
func main() {
 s := S{101}
 
 f1(&s)
 f2(&s)
 
 r := R{1111}
 f3(&r)
}

如上结构S实现了I的两个方法,因此S实现了I。因为S实现了I,因此可以调用f向其传递S类型值得指针。 总结如下: (1)使用“comma, ok” 来判断一个接口类型是否实现了某个特定接口:

if t, ok := something.(I) ; ok {
// 对于某些实现了接口I 的
// t 是其所拥有的类型
}

(2)声明为 interface 类型的变量,可以存储任何实现了 interface 中所有方法的类型的变量 (3)空接口可代表任何类型,可做形参和返回类型

复制代码代码如下:

package main import "fmt" func main() { //interface{} var i interface{} = 100 var s interface{} = "hello" fmt.Printf("i = %d, s = %s\n", i, s) s = i fmt.Printf("i = %d, s = %d\n", i, s) }

(4)interface组合

将一个 interface1 嵌入到另一个 interface2 的声明中,其作用相当于把 interface1 的函数包含到 interface2 中,但是组合中不同有重复的方法

注: a. 只要两个接口中的方法列表相同(与顺序无关),即为相同的接口,可以相互赋值 b. interface1 的方法列表属于另一个 interface2 的方法列表的子集,interface2 可以赋值给 interface1,反之不成立(因为方法缺失),interface2 中的方法会覆盖 interface1 中同名的方法 c. 可以嵌入包中的 interface

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-09-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • GO语言标准错误处理机制error用法实例

    本文实例讲述了GO语言标准错误处理机制error用法。分享给大家供大家参考。具体分析如下: 在 Golang 中,错误处理机制一般是函数返回时使用的,是对外的接...

    李海彬
  • GO语言标准错误处理机制error用法实例

    本文实例讲述了GO语言标准错误处理机制error用法。分享给大家供大家参考。具体分析如下: 在 Golang 中,错误处理机制一般是函数返回时使用的,是对外的接...

    李海彬
  • 关于go语言的几个陷阱

    所谓闭包就是指一个函数中的函数,并且这个函数可以调用外部的变量并且无论使用多少次, 都可以一直拥有这个变量不回收,那么这个变量可以称为闭包变量。

    李海彬
  • LintCode-632. 二叉树的最大节点

    悠扬前奏
  • golang学习之接口型函数

    先说下使用接口型函数的好处: 1、不必将某个接口函数附在某个type上面,保证了命名随意 2、 可以直接调用函数或者使用该接口,两两不耽误 直接上代码吧: //...

    用户1141560
  • 【leetcode刷题】T123-路径总和

    https://leetcode-cn.com/problems/path-sum

    木又AI帮
  • 如何降级Cloudera Manager和CDH

    在前面的文章中,Fayson介绍过《如何升级Cloudera Manager和CDH》,在实际使用过程中,我们往往会碰到将集群升级到一个较新的版本后,会出现一些...

    Fayson
  • 2.18 特殊权限set_uid

    set_uid 例子 -rwsr-xr-x.中的s的权限 [root@hf-01 ~]# which passwd /usr/bin/passwd [root@...

    运维小白
  • 图像处理的回眸女郎是何方神圣?

    我以前没对她产生过太多的疑问,感觉人们都用这个图,肯定和我平时丧心病狂的图像处理一定要用二次元图片一个心理。

    周旋
  • 如何使用PowerShell实现命令控制以及安全检查绕过

    Windows操作系统在全球市场上的占比是大家有目共睹的,而现代Windows平台都默认安装了PowerShell,而且系统管理员还可以毫无限制地访问和使用Po...

    FB客服

扫码关注云+社区

领取腾讯云代金券