接口的注意事项

接口的注意事项

【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{}​)的作用是可以存放任意类型的值,因为所有类型都实现了空接口。常见用途有:

  1. 通用容器:比如 fmt.Printlnmap[string]interface{}​、[]interface{}​,可以存储任意类型。
  2. 函数参数:当函数参数类型为 interface{}​ 时,可以接收任何类型的实参,实现通用处理。
  3. 类型断言与反射:通过类型断言或反射,可以在运行时判断和操作实际类型。

总结
空接口让 Go 代码具备一定的“泛型”能力,适合需要存储或处理多种类型数据的场景

posted @ 2025-07-02 18:10  hutaodd  阅读(5)  评论(0)    收藏  举报