接口的注意事项
接口的注意事项
【1】接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量。
//直接用接口创建实例,出错:
//var s SayHello
//s.sayHello()
var s SayHello = c
s.sayHello()
}
【2】只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。
//自定义数据类型:
type intager int
func(i intager) sayHello(){
fmt.Println("say hi", i)
}
func main() {
var i intager = 10
var s SayHello = i //接口类型的变量可以接收任何实现了该接口的类型
【3】一个自定义类型可以实现多个接口
package main
import (
"fmt"
)
type Ainterface interface {
a()
}
type Binterface interface {
b()
}
type Stu struct {
}
func (s Stu) a(){
fmt.Println("aaaa")
}
func (s Stu) b(){
fmt.Println("bbbb")
}
func main() {
var s Stu
var a Ainterface = s
var b Binterface = s
a.a()
b.b()
}
【4】一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现。
package main
import (
"fmt"
)
type Cinterface interface {
c()
}
type Binterface interface {
b()
}
type Ainterface interface {
Binterface
Cinterface
a()
}
type Stu struct {
}
func (s Stu) a(){
fmt.Println("a")
}
func (s Stu) b(){
fmt.Println("b")
}
func (s Stu) c(){
fmt.Println("c")
}
func main() {
var s Stu
var a Ainterface = s
a.a()
a.b()
a.c()
}
【5】interface类型默认是一个指针(引l用类型),如果没有对interface初始化就使用,那么会输出nil
【6】空接口没有任何方法,所以可以理解为所有类型都实现了空接口,也可以理解为我们可以把任何一个变量赋给空接口。
type E interface {
}
func main() {
var s Stu
var a Ainterface = s
a.a()
a.b()
a.c()
var e E = s
fmt.Println(e)
var e2 interface{} = s
fmt.Println(e2)
var num float64 = 9.3
var e3 interface{} = num
fmt.Println(e3)
}
空接口(interface{})的作用是可以存放任意类型的值,因为所有类型都实现了空接口。常见用途有:
- 通用容器:比如 fmt.Println、
map[string]interface{}、[]interface{},可以存储任意类型。 - 函数参数:当函数参数类型为
interface{} 时,可以接收任何类型的实参,实现通用处理。 - 类型断言与反射:通过类型断言或反射,可以在运行时判断和操作实际类型。
总结:
空接口让 Go 代码具备一定的“泛型”能力,适合需要存储或处理多种类型数据的场景

浙公网安备 33010602011771号