Go 开发常用操作技巧--接口

简介: 接口(interface)是对其他类型行为的抽象。接口是一种约束形式,其中只包括成员函数定义,不包含成员函数实现

接口(interface)是对其他类型行为的抽象。接口是一种约束形式,其中只包括成员函数定义,不包含成员函数实现,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

接口的定义:

type 接口名称 interface {
   method_name1(参数列表) [return_type]
   method_name2(参数列表) [return_type]
   method_name3(参数列表) [return_type]
   ...
}
复制代码

接口赋值

Go 语言接口不支持直接实例化,支持赋值操作,从而快速实现接口与实现类的映射。接口赋值有:

  • 将实现接口的对象实例赋值给接口
  • 一个接口赋值给另一个接口
  1. 将实现接口的对象实例赋值给接口
// 定义一个接口 NumberI
type NumberI interface{
  Equal(i Number) bool
}
type Number int
//判断是否相等
func (x Number) Equal(i Number) bool{
  return x == 1
}
复制代码

上面示例,Number 类型实现了 NumberI 接口中的所有方法,即实现了 NumberI 接口。然后便可以将 Number 类型对应的对象实例赋值给 NumberI 接口。

var x Number = 8
var y NumberI = &x
复制代码

可以将实例 x 的指针赋值给了接口变量,因为Go语言会自动生成一个新的与之对应的指针成员方法,即:

func (x Number) Equal(i Number) bool
func (x* Number) Equal(i Number) bool{
  return (*x).Equal(i)
}
复制代码
  1. 接口赋值给接口

Go语言中,只要两个接口有相同的方法列表(顺序无关),那么他们就是等同的,可以相互赋值。 如下 package1、package2 两个包中的两个接口并区别。

  • 任何实现了 package1.NumberInterface1 接口的类,也实现了 package2.NumberInterface2
  • 任何实现了 package1.NumberInterface1 接口的对象实例都可以赋值给 package2.NumberInterface2
package1
type NumberInterface1 interface {
  Equal(i int)bool
}
复制代码
package2
type NumberInterface2 interface {
  Equal(i int)bool
}
复制代码
// 实现两个接口的类 Number
type Number int
func (x Number) Equal(i int)bool{
  return int(x) == i
}
复制代码

下面的复制代码都是合法的:

var a number = 6
var b package1.NumberInterface1 = a
var c package2.NumberInterface2 = b
复制代码

另外,接口赋值并不要求两个接口方法完全相同,若接口 A 的方法列表为接口B 的子集,那么 B 可以复制给 A。例如:

package1
type A interface {
  Equal(i int)bool
}
复制代码
package2
type B interface {
  Equal(i int)bool
  Sum(i int)
}
// 实现两个接口的类 Number
type Number int
func (x Number) Equal(i int)bool{
  return int(x) == i
}
func (n *Number) Sum(i int){
  *n = *n + Number(i)
}
复制代码

下面的复制代码都是合法的:

var a number = 6
var b package2.NumberInterface2 = a
var c package1.NumberInterface1 = b
复制代码

类型推断

类型推断可以将接口变量还原为原始类型,还可用 switch...case 语句进行多种类型推断匹配。

var a interface{} = func(a int)string{
  return fmt.Sprintf("d:%d",a)
}
switch b := a.(type) {
  case nil:
    fmt.Println("nil")
  case *int:
    fmt.Println(*b)
  case func(int) string:
    fmt.Println(b(11))
  default:
    fmt.Println("unknow")
}
//d:11


相关文章
|
23天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
4月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
26天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
1月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
1月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
42 3
|
1月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
35 3
|
3月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
37 7
|
4月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
129 0
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
4月前
|
存储 安全 程序员
|
4月前
|
存储 设计模式 Go
深入理解Go语言的接口
【8月更文挑战第31天】
20 0