Go-Interface
在 Golang 中接口(interface)是一种类型,一种抽象的类型。接口(interface)是一组函数 method (方法)的集合,Golang 中的接口不能包含任何变量。
在 Golang 中接口中的所有方法都没有方法体,接口定义了一个对象的行为规范,只定
义规范不实现。接口体现了程序设计的多态和高内聚低耦合的思想Golang 中的接口也是一种数据类型,不需要显示实现。只需要一个变量含有接口类型
中的所有方法,那么这个变量就实现了这个接口。
定义接口
Golang 中每个接口由数个方法组成,接口的定义格式如下:
其中:
接口名:使用 type 将接口定义为自定义的类型名。Go 语言的接口在命名时,一般会在
单词后面添加 er,如有写操作的接口叫 Writer,有字符串功能的接口叫 Stringer 等。接
口名最好要能突出该接口的类型含义。
方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被
接口所在的包(package)之外的代码访问。
参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。
结构体实现接口
package main import "fmt" type Person interface { eat() play() //ku(name string, age int) int //定义参数 返回值 } type xm struct { } func (m xm) eat() { fmt.Println("Xiao Ming is eating an apple") } func (m xm) play() { fmt.Println("Xiao Ming is playing ping-pong") } // 结构体方法 func (m xm) run() { fmt.Println("Xiao Ming is running") } func main() { xm := xm{} // 实例化结构体 //xm结构体实现Person接口 var p Person = xm p.eat() p.play() //p.run() // 没有run接口方法 就会报错 xm.run() // 使用结构体对象调用自己的方法 /* 结果: Xiao Ming is eating an apple Xiao Ming is playing ping-pong Xiao Ming is running */ }
空接口
Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。空接口表示
没有任何约束,因此任何类型变量都可以实现空接口。因为空接口可以存储任意类型值的特点,所以空接口在 Go 语言中的使用十分广泛。
package main import "fmt" func main() { // 定义空接口 a a可以接收任何的数据类型 var a interface{} fmt.Printf("%T\n", a) //<nil> a = 1 fmt.Printf("type:%T == value:%v\n", a, a) //type:int == value:1 a = "Hello go" fmt.Printf("type:%T == value:%v\n", a, a) //type:string == value:Hello go a = true fmt.Printf("type:%T == value:%v\n", a, a) //type:bool == value:true }
空接口作为函数的参数
使用空接口实现可以接收任意类型的函数参数。
// 空接口作为函数参数 func show(a interface{}) { fmt.Printf("type:%T value:%v\n", a, a) }
map 的值实现空接口
使用空接口实现可以保存任意值的字典。
// 空接口作为 map 值 var studentInfo = make(map[string]interface{}) studentInfo["name"] = "张三" studentInfo["age"] = 18 studentInfo["married"] = false fmt.Println(studentInfo)
切片实现空接口
var slice = []interface{}{"张三", 20, true, 32.2} fmt.Println(slice)
断言
断言就是对接口类型进行判断
语法格式:
x.(T)
x : 表示类型为 interface{}的变量
T : 表示断言 x 可能是的类型。
_, ok := a.(bool) if ok { fmt.Println("断言成功,value==", a) //断言成功,value== true } else { fmt.Println("断言失败") }
结合Switch做出断言
package main import "fmt" func name(x interface{}) { switch v := x.(type) { case string: fmt.Println("string", v) case int: fmt.Println("int", v) case bool: fmt.Println("bool", v) default: fmt.Println("default", v) } } func main() { name(100) //int 100 name("Java Rust Go") //string Java Rust Go }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南