go接口
接口 interface
go语言使用interface来实现多态,并且是非侵入的,不需要具体的类型来继承接口,只需要具体的类型提供指定的方法就可以了。
接口中不存在成员变量,也不存在方法实现,所以可以解决多继承中的冲突(即使方法名重复了也没啥,不会出现歧义)。
比如下面的代码,对于正方形和圆形都实现了计算面积的area
方法,所以可以说square
和circle
实现了接口shape
。
package main
import (
"fmt"
"math"
)
type square struct {
side float64
}
type circle struct {
radius float64
}
type shape interface {
area() float64
}
func (s square) area() float64 {
return s.side * s.side
}
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func info(z shape) {
fmt.Println(z)
fmt.Println(z.area())
}
func main() {
s := square{10}
c := circle{5}
info(s)
info(c)
}
接口比较
接口值是可比较的。如果两个接口值具有相同的动态类型并且动态值是可比较的并且动态值相等,或者两个接口值都为nil
则它们相等。
package main
import (
"fmt"
)
type bird struct {
}
type flyable interface {
fly()
}
func (s bird) fly() {
fmt.Println("fly")
}
func main() {
var f flyable = bird{}
var f2 flyable = bird{}
fmt.Println(f == f2) // true
}
类型断言
对于一个接口对象,可以使用类型断言来进行类型判断和转换。使用语法value, ok := i.(type)
来实现。
var n int = 100
var i interface{} = n
// 判断是否为该类型,如果不是nn就是默认值,并且ok为false,不会panic
nn, ok := i.(int)
// 判断是否为该类型,如果不是那么会panic
mm := i.(int)
空接口 interface{}
空接口没有任何要实现的方法,所以任何类型都可以用空接口保存,go语言用它来实现传入任意类型的值,比如fmt.Println
。
type any = interface{}
func Println(a ...any) (n int, err error) {
return Fprintln(os.Stdout, a...)
}
咱们自己也可以这样来实现传入任意的参数的函数。
package main
import "fmt"
func myPrint(args ...interface{}) {
for i, value := range args {
// 这时value的类型其实还是interface{}
fmt.Printf("idx: %d type: %T value: %v\n", i, value, value)
fmt.Println()
}
}
func main() {
// idx: 0 type: int value: 12
// idx: 1 type: string value: haha
myPrint(12, "haha")
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)